Я пытаюсь записать звук через Accessibility как В Android Документация разработчика упомянуто
"Приложение может захватывать звук, если оно является службой специальных возможностей."
Ниже приведен мой код для Службы специальных возможностей:
public class MyAccessibilityService extends AccessibilityService {
private static final String TAG="MyAccessibilityService";
public static final String START_RECORDING="START_RECORDING";
public static final String STOP_RECORDING="STOP_RECORDING";
private Context context;
MediaRecorder recorder;
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG,"MyAccessibilityService Salesken Started ...");
context=this;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null) {
String action = intent.getAction();
switch (action) {
case START_RECORDING:
Log.d(TAG,"Start Recording");
String contact = intent.getStringExtra("contact");
startRecorder(contact);
break;
case STOP_RECORDING:
Log.d(TAG,"Stop Recording");
stopRecorder();
break;
}
}
return super.onStartCommand(intent, flags, startId);
}
private void stopRecorder() {
if(recorder != null){
recorder.stop();
recorder.release();
}
}
private void startRecorder(String contact) {
String timestamp = new SimpleDateFormat("dd-MM-yyyy-hh-mm-ss", Locale.US).format(new Date());
String fileName =contact +"-"+timestamp+".pcm";
MediaSaver mediaSaver = new MediaSaver(context).setParentDirectoryName("AudioRecording").
setFileNameKeepOriginalExtension(fileName).
setExternal(MediaSaver.isExternalStorageReadable());
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(mediaSaver.pathFile().getAbsolutePath());
try {
recorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
recorder.start();
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
}
@Override
public void onInterrupt() {
}
@Override
public void onDestroy() {
super.onDestroy();
stopRecorder();
}
}
Каждый раз, когда я звоню START_RECORDING в мою Службу специальных возможностей, я получаю ниже исключения в службе
java.lang.RuntimeException: start failed.
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4222)
at android.app.ActivityThread.access$2100(ActivityThread.java:231)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1984)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
Caused by: java.lang.RuntimeException: start failed.
at android.media.MediaRecorder.native_start(Native Method)
В моем манифесте ниже указано разрешение:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
Я не уверен, как использовать AudioManager.AudioRecordingCallback на AudioRecord или MediaRecorder, чтобы он мог захватывать звук голосового вызова.