エミュレーターで次のコードを実行すると、呼び出しが開始され、呼び出しが切断されると、stop 関数が呼び出されると NullPointerException が表示され、VOICE_CALL をオーディオソースとして使用すると、出力が空のファイルになります。しかし、オーディオソースとして VOICE_UPLINK を指定すると機能します (まだ nullpointer 例外があります)。デバイスで実行すると、番号がダイヤルされるとすぐに FileNotFound 例外と Permission Denied が表示されます。ただし、マニフェスト ファイルで必要なアクセス許可を与えています。
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
私はあちこちからコードをインターネットからのみ入手しました。私が作ったものは完全な災害でした..完全なクラスコード:
public class ServiceReceiver extends BroadcastReceiver {
PhoneStateListener listener;
TelephonyManager telephony;
MediaRecorder recorder = new MediaRecorder();
@Override
public void onReceive(Context context, Intent intent) {
telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
listener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch(state)
{
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.d("DEBUG", "OFFHOOK");
StartRecording();
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.d("DEBUG", "IDLE");
StopRecording();
break;
case TelephonyManager.CALL_STATE_RINGING:
Log.d("DEBUG", "RINGING");
break;
}
}
public void StartRecording(){
recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(this.getFullSdPath());
try {
recorder.prepare();
Log.i(this.getClass().getName(), "Prepared");
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.i(this.getClass().getName(), "ERR 1");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.i(this.getClass().getName(), "ERR 2");
}
recorder.start(); // Recording is now started
Log.i(this.getClass().getName(), "Start Recording");
}
public void StopRecording(){
recorder.stop();
recorder.release();
recorder = null;
Log.i(this.getClass().getName(), "Stop Recording");
}
public String getFullSdPath(){
File sdCard = new File(Environment.getExternalStorageDirectory() + "/RecordMyVoice");
if (!sdCard.exists()) {
sdCard.mkdir();
}
File file = new File(Environment.getExternalStorageDirectory()+"/RecordMyVoice/",new Date().getTime()+".mp4");
System.out.println("Full path of record sound is : "+file.getAbsolutePath());
return file.getAbsolutePath();
}
};
telephony.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
}
}
私は何か間違ったことをしていますか?Androidでは通話録音アプリはそう簡単に作れないと聞きました。