diff --git a/src/main/java/org/qpython/qsl4a/qsl4a/facade/MediaRecorderFacade.java b/src/main/java/org/qpython/qsl4a/qsl4a/facade/MediaRecorderFacade.java index 0eab0dc3d3e553f7d055cafa8952b77a9d19698d..d68057d8004e0b6b6052920e98d9ecd0c68ca68b 100644 --- a/src/main/java/org/qpython/qsl4a/qsl4a/facade/MediaRecorderFacade.java +++ b/src/main/java/org/qpython/qsl4a/qsl4a/facade/MediaRecorderFacade.java @@ -70,8 +70,8 @@ public class MediaRecorderFacade extends RpcReceiver { @Rpc(description = "Records audio from the microphone and saves it to the given location.") public void recorderStartMicrophone(@RpcParameter(name = "targetPath") String targetPath) - throws IOException { - startAudioRecording(targetPath, MediaRecorder.AudioSource.MIC); + throws Exception { + startAudioRecording(targetPath); } @Rpc(description = "Records video from the camera and saves it to the given location. " @@ -126,7 +126,7 @@ public class MediaRecorderFacade extends RpcReceiver { break; } - mMediaRecorder.setAudioSource(audioSource); + setAudioSource(audioSource); String extension = file.toString().split("\\.")[1]; if (extension.equals("mp4")) { mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); @@ -181,7 +181,7 @@ public class MediaRecorderFacade extends RpcReceiver { } catch (Exception e) { LogUtil.e(e); } - mMediaRecorder.setAudioSource(audioSource); + setAudioSource(audioSource); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); } else { @@ -200,8 +200,8 @@ public class MediaRecorderFacade extends RpcReceiver { prepTask.finish(); } - private void startAudioRecording(String targetPath, int source) throws IOException { - mMediaRecorder.setAudioSource(source); + private void startAudioRecording(String targetPath) throws Exception { + setAudioSource(); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mMediaRecorder.setOutputFile(targetPath); @@ -209,6 +209,18 @@ public class MediaRecorderFacade extends RpcReceiver { mMediaRecorder.start(); } + private void setAudioSource() throws Exception { + setAudioSource(MediaRecorder.AudioSource.MIC); + } + + private void setAudioSource(int source) throws Exception { + try { + mMediaRecorder.setAudioSource(source); + } catch(Exception e){ + throw new Exception("Please check Microphone Permission .\n"+e); + } + } + @Rpc(description = "Stops a previously started recording.") public void recorderStop() { mMediaRecorder.stop(); diff --git a/src/main/java/org/qpython/qsl4a/qsl4a/facade/SettingsFacade.java b/src/main/java/org/qpython/qsl4a/qsl4a/facade/SettingsFacade.java index 151490eb301a406530dcb96a0fb2d86d0fba5b9b..2f29d230ef6e7bd18aadd5a581667a10b3c0cfbb 100644 --- a/src/main/java/org/qpython/qsl4a/qsl4a/facade/SettingsFacade.java +++ b/src/main/java/org/qpython/qsl4a/qsl4a/facade/SettingsFacade.java @@ -276,15 +276,25 @@ public class SettingsFacade extends RpcReceiver { } @Rpc(description = "get system infomation .") - public Map getSysInfo(){ - Map s = new HashMap<>(); + public Map getSysInfo() { + Map s = new HashMap<>(); s.put("model", Build.MODEL); - s.put("sdk",Build.VERSION.SDK); - s.put("release",Build.VERSION.RELEASE); - s.put("brand",Build.BRAND); - s.put("device",Build.DEVICE); - s.put("display",Build.DISPLAY); + s.put("sdk", Build.VERSION.SDK_INT); + s.put("release", Build.VERSION.RELEASE); + s.put("brand", Build.BRAND); + s.put("device", Build.DEVICE); + s.put("display", Build.DISPLAY); + s.put("manufacturer", Build.MANUFACTURER); s.put("language", Locale.getDefault().getLanguage()); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) + s.put("serial", Build.getSerial()); + else + s.put("serial", Build.SERIAL); + } catch (Exception ignored){} + s.put("hardware", Build.HARDWARE); + s.put("user", Build.USER); + s.put("abis", Build.SUPPORTED_ABIS); return s; } diff --git a/src/main/java/org/qpython/qsl4a/qsl4a/facade/TextToSpeechFacade.java b/src/main/java/org/qpython/qsl4a/qsl4a/facade/TextToSpeechFacade.java index 147b4559ad6b0da1da252f83dc8ec5b3519fae5d..9dc0e39a6b47a7b8486c0fa572a1f1c4061d2f36 100644 --- a/src/main/java/org/qpython/qsl4a/qsl4a/facade/TextToSpeechFacade.java +++ b/src/main/java/org/qpython/qsl4a/qsl4a/facade/TextToSpeechFacade.java @@ -20,10 +20,9 @@ import android.os.SystemClock; import android.speech.tts.TextToSpeech; import android.speech.tts.TextToSpeech.OnInitListener; - import org.qpython.qsl4a.qsl4a.jsonrpc.RpcReceiver; import org.qpython.qsl4a.qsl4a.rpc.Rpc; -import org.qpython.qsl4a.qsl4a.rpc.RpcMinSdk; +import org.qpython.qsl4a.qsl4a.rpc.RpcDefault; import org.qpython.qsl4a.qsl4a.rpc.RpcParameter; import java.util.concurrent.CountDownLatch; @@ -32,7 +31,6 @@ import java.util.concurrent.CountDownLatch; * Provides Text To Speech services for API 4 or more. */ -@RpcMinSdk(4) public class TextToSpeechFacade extends RpcReceiver { private final TextToSpeech mTts; @@ -58,10 +56,16 @@ public class TextToSpeechFacade extends RpcReceiver { } @Rpc(description = "Speaks the provided message via TTS.") - public void ttsSpeak(@RpcParameter(name = "message") String message) throws InterruptedException { + public void ttsSpeak( + @RpcParameter(name = "message") String message, + @RpcParameter(name = "pitch") @RpcDefault("1.0") Double pitch, + @RpcParameter(name = "pitchRate") @RpcDefault("1.0") Double pitchRate + ) throws InterruptedException { mOnInitLock.await(); if (message != null) { - mTts.speak(message, TextToSpeech.QUEUE_ADD, null); + mTts.setSpeechRate(pitchRate.floatValue()); + mTts.setPitch(pitch.floatValue()); + mTts.speak(message, TextToSpeech.QUEUE_ADD, null,null); } } diff --git a/src/main/java/org/qpython/qsl4a/qsl4a/rpc/MethodDescriptor.java b/src/main/java/org/qpython/qsl4a/qsl4a/rpc/MethodDescriptor.java index 72fb263785c7425c042c8240930034bf0bdc1336..ce99cbcea5c2b0fe544fed6cd170bf052f0d4c1f 100644 --- a/src/main/java/org/qpython/qsl4a/qsl4a/rpc/MethodDescriptor.java +++ b/src/main/java/org/qpython/qsl4a/qsl4a/rpc/MethodDescriptor.java @@ -506,6 +506,16 @@ public final class MethodDescriptor { throw new IllegalArgumentException("'" + input + "' is not a boolean"); } }); + converters.put(Double.class, new Converter() { + @Override + public Double convert(String input) { + try { + return Double.parseDouble(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("'" + input + "' is not a float"); + } + } + }); return converters; } }