オートコールレコーダーアプリを使用しています。以下で音声通話を録音できますAndroid 6 MediaRecorder.AudioSource.VOICE_CALL
を使用して、From Android 6 not VOICE_CALLを使用して音声通話を録音できます。MediaRecorder.AudioSource.MIC
を使用して録音できましたが、ここでは着信音声が録音されず、音声通話を録音したいですスピーカーオンモードではなく、通常モードでこれを手伝ってください(私はXiomi Redmi 4a(Android 6)で動作しませんでした)。
myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
myRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
myRecorder.setMaxDuration(60 * 60 * 1000);
AudioManager audiomanager =
(AudioManager)getSystemService(AUDIO_SERVICE);
audiomanager.setMode(2);
編集:権限に問題はありません。
更新:誰でも別のストリームをMICオーディオソースに強制する方法を知っています。これにはネイティブAndroidコード。これを手伝ってください。) 音声ルーティングの詳細についてはこの質問を参照してください
Ndkを使用する必要があります。実行する必要がある機能の例を次に示します。
Libmedia.soおよびlibutils.soをロードします
int load(JNIEnv *env, jobject thiz) {
void *handleLibMedia;
void *handleLibUtils;
int result = -1;
lspr func = NULL;
pthread_t newthread = (pthread_t) thiz;
handleLibMedia = dlopen("libmedia.so", RTLD_NOW | RTLD_GLOBAL);
if (handleLibMedia != NULL) {
func = dlsym(handleLibMedia, "_ZN7Android11AudioSystem13setParametersEiRKNS_7String8E");
if (func != NULL) {
result = 0;
}
audioSetParameters = (lasp) func;
} else {
result = -1;
}
handleLibUtils = dlopen("libutils.so", RTLD_NOW | RTLD_GLOBAL);
if (handleLibUtils != NULL) {
fstr = dlsym(handleLibUtils, "_ZN7Android7String8C2EPKc");
if (fstr == NULL) {
result = -1;
}
} else {
result = -1;
}
cmd = CM_D;
int resultTh = pthread_create(&newthread, NULL, taskAudioSetParam, NULL);
return result;}
関数setParameters
int setParam(jint i, jint as) {
pthread_mutex_lock(&mt);
audioSession = (int) (as + 1);
kvp = "input_source=4";
kvps = toString8(kvp);
cmd = (int) i;
pthread_cond_signal(&cnd);
pthread_mutex_unlock(&mt);
return 0;}
タスクAudioSetParameters
void *taskAudioSetParam(void *threadid) {
while (1) {
pthread_mutex_lock(&mt);
if (cmd == CM_D) {
pthread_cond_wait(&cnd, &mt);
} else if (audioSetParameters != NULL) {
audioSetParameters(audioSession, kvps);
}
pthread_mutex_unlock(&mt);
}
}
ライブラリと使用例があります https://github.com/ViktorDegtyarev/CallRecLib
Xiaomiデバイスには、実行時でもインストール時でも、常に許可要求に関する問題があります。
Xiaomi Redmi 3 proを使用しており、アプリをインストールするときに常に許可を拒否するよう強制するため、手動で許可する必要があります。あなたの問題が同じ場合、私はいくつかの回避策のソリューションを見つけ、それは私のために働いた: MIUIセキュリティアプリの自動起動許可をプログラムで取得する方法?
最初に、マニフェストではこれら3つの権限が必要です。また、デバイスがマシュマロより上にある場合はランタイムの権限要求が必要です。
_<uses-permission Android:name="Android.permission.READ_PHONE_STATE" />
<uses-permission Android:name="Android.permission.RECORD_AUDIO" />
<uses-permission Android:name="Android.permission.CAPTURE_AUDIO_OUTPUT" />
_
MediaRecorder.AudioSource.VOICE_CALL
_はすべての電話でサポートされているわけではないため、引き続き_MediaRecorder.AudioSource.MIC
_を使用する必要があります。私はこれを使用し、ほとんどのデバイスで正常に動作しますが、
_recorder = new MediaRecorder();
recorder.setAudioSource(audioSource);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(your_path);
_
通話を適切に記録するには、これを設定する必要があります。
audioManager.setMode(AudioManager.MODE_IN_CALL);
録音を開始するときに音量レベルを上げるaudioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL), 0);
記録を停止するときは、モードを通常、audioManager.setMode(AudioManager.MODE_NORMAL);
に設定し、ストリームボリュームを設定して元の状態に戻します。
これは、権限に関連する問題である可能性があります。
Android 6.0 Marshmallowを導入すると、アプリはインストール時に許可を与えられません。代わりに、アプリケーションは実行時にユーザーに1つずつ許可を求める必要があります。 。
Marshmallow以降を搭載したデバイスのアクセス許可を明示的に要求するコードを含めてください。
試してみる
MediaRecorder.AudioSource.VOICE_COMMUNICATION
そして見る
https://androidforums.com/threads/Android-phone-with-call-recording-function.181663/