如何检测MediaRecorder是否被其他应用程序使用?

4

我想要检测其他应用是否正在使用MediaRecorder,以便停止我的录音机并在以后继续使用。我看到了安卓的语音录音应用程序,它正是我所说的,但是它是如何实现的呢? 谢谢。


你能否详细说明为什么你想知道,我的意思是什么规格? - Daud Arfin
因为当我同时录制音频并在Skype中通话时,我的朋友无法听到我的声音。我认为这是MediaRecorder的问题,因为当我不使用它时,一切都很完美。谢谢! - Nika
看起来你真正想要的有点棘手:为了做到你似乎想要的,你需要在录制时确定是否有其他东西“想要”使用MediaRecorder,如果是这样,在他们尝试失败之前释放你的MediaRecorder。如果你有一个你认为可以做到这一点的应用程序示例,你可以尝试使用它对你自己的测试MediaRecorder进行运行,并验证它是否实际上将其释放给你,你还可以尝试找出在你的应用程序准备过程中其他应用程序何时释放它,通过让你自己的应用程序不完成该过程并查看其他应用程序是否仍然停止来解决这个问题。 - Chris Stratton
这就是我想做的事情,但我唯一的证据只有应用程序,没有源代码。当其他应用程序尝试使用MediaRecorder类(例如Skype)时,Android的Audio Record会自动停止。我正在尝试找到一种方法来实现这样的功能,但是一直找不到。我已经尝试了一个月,真的很累了。 谢谢。 - Nika
2个回答

2

当另一个程序试图访问MediaRecorder时,您要么会收到错误消息,要么程序崩溃。换句话说,您拥有它的独占访问权。

您无法直接获取MediaRecorder的状态,但是可以验证是否正在录制。以下是可以实现您需求的代码:

package com.aplayer;

import java.io.IOException;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.widget.Toast;

public class APlayerActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        MediaRecorder 
        recorder = new MediaRecorder();
          recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        recorder.setOutputFile("/sdcard/test.wav");

        try {
            recorder.prepare();

        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            Log.d("ERROR ","IllegalStateException");

            Toast msg = Toast.makeText(APlayerActivity.this, "IllegalStateException", Toast.LENGTH_LONG);
            msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
            msg.show();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            Log.d("ERROR ","IOException");
            e.printStackTrace();

            Toast msg = Toast.makeText(APlayerActivity.this, "IOException", Toast.LENGTH_LONG);
            msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
            msg.show();
        } 

        try {
        recorder.start();

        Toast msg = Toast.makeText(APlayerActivity.this, "Recording", Toast.LENGTH_LONG);
        msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
        msg.show();

        } catch (Exception e) {
        Log.e("ERROR", "start() failed");

        Toast msg = Toast.makeText(APlayerActivity.this, "Recording failed", Toast.LENGTH_LONG);
        msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
        msg.show();

        }

   }
}

嗨,我是Android编程的新手,如果有关系的话,我没有在activity中使用代码。我创建了一个用于记录并与计时器一起使用以使它们处于活动状态的类。这是类。 http://pastebin.com/U9FBgZpi 谢谢。 - Nika
在方法 public static void StartRecord() 中,你调用了方法:recorder.start()。请不要直接调用它,而是像上面我的代码那样加上 try-catch 块,否则当 mediarecorder 正在使用时程序会崩溃。 - Frank Anemaet
没有任何应用程序可以在您的程序锁定它时使用MediaRecorder。因此,基本上这是不可能的。但是,您可以尝试一些黑客技巧,例如短时间内释放它或者基于进程列表中的某些程序停止录制。 - Frank Anemaet
那么安卓的语音记录应用是如何做到的呢?每当我打电话给朋友时,语音记录应用会立即停止,我可以毫无问题地进行VoIP通话。一定有某种方法! - Nika
这是一个解决方法。例如,如果您运行语音记录器,请将其设置为录制状态,然后使用语音搜索,您会看到它显示了一个音频错误。请注意,MediaRecord和AudioRecord没有暂停功能,请参见:https://dev59.com/cFzUa4cB1Zd3GeqP7eXe 因此,我认为Voice Record程序正在监听某些事件。您可以监听来电事件,但我不确定是否包括VoIP呼叫:请参见线程https://dev59.com/12s05IYBdhLWcg3wCNlG - Frank Anemaet
显示剩余4条评论

1
 public boolean isMicrophoneAvailable() {
    boolean available = true;
    AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_DEFAULT, 44100);
    try {
        if (recorder.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED) {
            available = false;
        }
        recorder.startRecording();
        if (recorder.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
            recorder.stop();
            available = false;

        }
        recorder.stop();
    } finally {
        recorder.release();
    }

    return available;
}

请编辑您的答案并添加一些解释,使其更清晰易懂。 - Saeed Zhiany
如何检查麦克风是否被任何后台应用程序使用的重复问题。 - Ahmad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接