Служба специальных возможностей: AudioManager.AudioRecordingCallback на AudioRecord или MediaRecorder - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь записать звук через 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, чтобы он мог захватывать звук голосового вызова.

...