当前位置: 首页 > 知识库问答 >
问题:

辅助功能服务:AudioManager。AudioRecording在audio record或MediaRecorder上回调

何正德
2023-03-14

我正试图通过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。AudioRecordingAudio录制或MediaRecorder上的回拨,以便它可以捕获语音呼叫音频。

共有1个答案

有骏奇
2023-03-14

MediaRecorder.AudioSource.VOICE系统应用的_CALL。

recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);

从VOICE_CALL捕获需要Manifest.permission.CAPTURE_AUDIO_OUTPUT权限。此权限保留给系统组件使用,第三方应用程序不可用。

语音通话文档

您可以在启用无障碍服务后使用语音识别信号源。

然而,它仍然无法在某些国家或某些物理设备中工作。有法律问题,所以三星、华为和小米将采取不同的行动。

  recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_RECOGNITION);
 类似资料:
  • 为程序制作辅助功能是很重要的。在这里,我们很高兴地向你们介绍Devtron和Spectron。这两个新功能有机会使开发者们让他们的应用程序更加可用。 Electron 应用中有关辅助功能的开发和网站是相似的,因为两者最终使用的都是HTML. 然而, 对于Electron应用, 你不能使用在线的辅助功能审查者, 因为你的应用没有一个URL可以提供给审查者. 然而这些新功能将这些审查工具带到您的Ele

  • 为程序制作辅助功能是很重要的。在这里,我们很高兴地向你们介绍Devtron和Spectron。这两个新功能有机会使开发者们让他们的应用程序更加可用。 Electron 应用中有关辅助功能的开发和网站是相似的,因为两者最终使用的都是HTML. 然而, 对于Electron应用, 你不能使用在线的辅助功能审查者, 因为你的应用没有一个URL可以提供给审查者. 这些功能将会提供一些审查工具给你的Elec

  • 扩展使用者能够根据个人的能力和偏好创建理想的浏览体验。 扩展程序应包括可访问性组件,该组件通过使视力障碍,听力受损,肢体受限和其他残障人士能够访问扩展程序,从而鼓励包容性用户群。 每个人,不仅是有特殊需求的用户,都可以从辅助功能中受益。 视力障碍,肢体受限用户都将从键盘快捷键中受益。 字幕和笔录对聋哑用户至关重要,但也对语言学习者有所帮助。 人们可以通过多种方式与扩展互动。一些用户具有标准的显示器

  • 一般来说,可访问性意味着可用性,内容可访问意味着内容可用。 在软件方面,应用程序可访问意味着应用程序可供所有人使用。 在这里,所有意味着残疾人,视障者或使用屏幕阅读器使用计算机的人或者喜欢使用键盘而不是使用鼠标导航的人。 用键盘导航而不是使用鼠标。 可访问的应用程序称为ARIA(可访问的富Internet应用程序)。 Ext JS中的辅助功能 Ext JS旨在记住它应该适用于所有键盘导航。 它具有

  • 有人可以请给我一个Android辅助功能服务实时音频处理的示例代码。我需要处理呼叫音频。但不知道如何实现这一点。请分享您对此的看法 请查看以下清单: 请在下面查找可访问性xml: PFB服务: