4

voice_call のオーディオ ソースが利用可能かどうかを確認したい:

MediaRecorder.AudioSource.VOICE_CALL

一部のデバイスでは許可されていないため、プログラムで通話を録音できるかどうかを確認するにはどうすればよいですか?

前もって感謝します。

コビ

4

3 に答える 3

0

私はこのプロセスを行いました: レコーダーの開始と停止時に、try / catch ブロックで必要な形のファイルを作成しようとしましたが、すべてうまくいき、選択したオーディオソースで動作しました。

public class sRecAudioMic extends Service {

DecimalFormat fCoordenadas = new DecimalFormat("##.00000000");
DecimalFormat fVelocidade = new DecimalFormat("##.0");
static String imei = "";

private static String FORMATO_AUDIO = ".aac";
static String AUDIO_RECORDER_FOLDER = "";
static String codigo_usuario = "";

int contSegundos = 0;

static MediaRecorder recorder;

Boolean cancelTask = false;

eChamada chamada;

Context context;

public sRecAudioMic() {
}



@Override
public IBinder onBind(Intent intent) {
    throw new UnsupportedOperationException("Not yet implemented");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    return super.onStartCommand(intent, flags, startId);
}

@Override
public void onCreate() {
    imei = Functions.getIMEI(sRecAudioMic.this);

    AUDIO_RECORDER_FOLDER = new _Path().getPathAudio();
}

@SuppressLint("InlinedApi")
@Override
public void onStart(Intent intent, int startId) {

    try
    {
        Bundle b = intent.getExtras();
        chamada = (eChamada) b.getSerializable("Chamada");

        //chamada = (eChamada) intent.getParcelableExtra("Chamada");
        String t = "";
        t = " ";
    }
    catch(Exception e)
    {
        String t = "";

        t = " ";
    }       

    String nomeArquivo = "";

    int cont = 0;

    Calendar lCDateTime = Calendar.getInstance();

    String t = String.valueOf(lCDateTime.getTimeInMillis());

    nomeArquivo = "recording_" + t + FORMATO_AUDIO;

    nomeArquivo = nomeArquivo.replace(" ", "_").replace(":", "_")
            .replace("-", "_");

    String caminhoArquivo = AUDIO_RECORDER_FOLDER + "/" + nomeArquivo;

    chamada.nomeArquivo = nomeArquivo;
    chamada.caminhoArquivo = caminhoArquivo;

    try {

        recorder = new MediaRecorder();

        try {

            MediaRecorder r = new MediaRecorder();
            r.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
            r.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            r.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
            r.setOutputFile(caminhoArquivo);
            r.setAudioSamplingRate(96000);
            r.prepare();
            r.start();
            r.stop();
            r.reset();
            r.release();

            r = null;

            recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);

        } catch (Exception e) {

            MediaRecorder r = new MediaRecorder();
            r.setAudioSource(MediaRecorder.AudioSource.MIC);
            r.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            r.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
            r.setOutputFile(caminhoArquivo);
            r.setAudioSamplingRate(96000);
            r.prepare();
            r.start();
            r.stop();
            r.reset();

            r = null;

            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        }

        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        recorder.setAudioSamplingRate(96000);
        // recorder.setMaxDuration(30000);

        recorder.setOutputFile(caminhoArquivo);

        recorder.setOnErrorListener(errorListener);
        recorder.setOnInfoListener(infoListener);

        recorder.prepare();
        recorder.start();

    } catch (Exception e) {
        e.printStackTrace();

        new LOG().CriaLog("sRecAudioMic", "onStart()", e.getMessage(), "");

    } finally {

    }

}

@Override
public void onDestroy() {

    String time = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss")
            .format(new java.util.Date());

    if (null != recorder) {

        // para gravacao
        recorder.stop();
        recorder.reset();
        recorder.release();

        recorder = null;
    }

    chamada.timestampChamadaTerminada = time;

    ChamadasDataSource dsCham = new ChamadasDataSource(sRecAudioMic.this);

    dsCham.open();

    dsCham.insert(chamada);

    dsCham.close();

}

@SuppressLint("NewApi")
private MediaRecorder.OnErrorListener errorListener = new MediaRecorder.OnErrorListener() {
    @Override
    public void onError(MediaRecorder mr, int what, int extra) {

    }
};

@SuppressLint("NewApi")
private MediaRecorder.OnInfoListener infoListener = new MediaRecorder.OnInfoListener() {
    @Override
    public void onInfo(MediaRecorder mr, int what, int extra) {

    }
};

}

于 2015-06-03T20:02:26.243 に答える