Проблема с созданием приложения для записи звонков с правами доступа root - PullRequest
1 голос
/ 19 февраля 2020

Я пытаюсь сделать приложение для записи звонков на Xiaomi Redmi 4A с обычной системой Havock и Android 9.0 P IE. Вы можете найти весь код здесь:

https://github.com/JakubBelka/CallRecording

Я использую класс MediaRecorder для записи голоса во время телефонного разговора. Чтобы получить записи очень хорошего качества, я хочу установить AudioSource как VOICE_CALL вместо микрофона.

Код ниже:

callrecorder = new MediaRecorder();
**callrecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);**
callrecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
callrecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
callrecorder.setOutputFile(Environment.getExternalStorageDirectory() + "/Download/record.amr");
try {
       callrecorder.prepare();
} catch (IllegalStateException e) {
        e.printStackTrace();
} catch (IOException e) {
}
callrecorder.start();

У меня есть разрешения root, и это приложение установлено в качестве вызывающего приложения по умолчанию, но при попытке начать запись по-прежнему возникает ошибка:

System.err: java.lang.RuntimeException: start failed.
System.err:     at android.media.MediaRecorder.start(Native Method)
System.err:     at RecordAnswer.doInBackground(RecordAnswer.java:24)
System.err:     at android.os.AsyncTask$3.call(AsyncTask.java:378)
System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)  
System.err:     at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
System.err:     at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
System.err:     at java.lang.Thread.run(Thread.java:919)

Я думаю, что проблема в выбранном аудиоисточнике, потому что когда я использую источник DEFAULT, все в порядке, но качество записи не самое лучшее. Я забочусь об этом, потому что хочу напрямую записать VOICE_DOWNLINK.

Это нормально:

`callrecorder = new MediaRecorder();
        **callrecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);**
        callrecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
        callrecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

Ниже приведены все мои разрешения из манифеста. xml:

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS"/>
<uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.STORAGE" />
...