[英]Permission problems for sound recording
我在設備上錄制聲音時遇到了幾個問題。 我正在使用的代碼是否來自android dev站點( Site Link ),如下所示:
public void onClickStart(View v) throws IllegalStateException, IOException{
startRecord();
}
public void onClickStop(View v) throws IllegalStateException, IOException{
stopRecord();
}
private void startRecord() throws IllegalStateException, IOException{
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC); //ok so I say audio source is the microphone, is it windows/linux microphone on the emulator?
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile("/sdcard/test.3gpp");
recorder.prepare();
recorder.start();
}
private void stopRecord(){
recorder.stop();
// recorder.release();
}
在主布局中有2個按鈕,它既可以停止又可以開始錄制(理論上就是這樣)。
但是在LogCat上在我的設備上進行嘗試時(真的不能在模擬器上進行嘗試),我得到以下錯誤:
Error 1:
ERROR/MediaRecorder(14541): start called in an invalid state: 4
java.lang.IllegalStateException: Could not execute method of the activity
Caused by: java.lang.reflect.InvocationTargetException
Error 2:
Caused by: java.io.FileNotFoundException: /sdcard/test.3gpp (Permission denied)
我的Manifest.xml文件中還設置了以下權限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
傻錯誤在這里對不起,它沒有用,因為我將手機安裝在筆記本電腦上,因此無法實際到達sdcard。
對於錯誤2:請嘗試靜態使用getExternalStorageDirectory()
而不是“ sdcard”,也許該路徑在您的設備上無效/可訪問。
對於偶然發現此問題的其他人,該異常並不總是告訴您FileNotFoundException與拒絕權限相關聯。 檢查您的AndroidManifest.xml上是否存在權限WRITE_EXTERNAL_STORAGE。 就OP而言,確實如此。
即使您創建了外部SD卡文件(使用mksdcard命令)並將其與手機相關聯,對getExternalStorageDirectory()的調用仍可能指向/ sdcard(因為該方法的合同不能保證它將返回非-內部存儲位置)。 您始終可以使用“ adb shell”命令來檢查sdcard是否存在。 如果要將文件復制到sdcard或從sdcard復制文件,請使用“ adb pull” /“ adb push”命令。
參考文獻:
http://developer.android.com/guide/developing/devices/emulator.html#sdcard
不要在輸出文件中對/sdcard/test.3gpp
進行硬核/sdcard/test.3gpp
,應使用getExternalStorage()
使用以下代碼:
boolean exists = (new File(android.os.Environment.getExternalStorageDirectory() + "/Record/")).exists();
if (!exists) {
new File(android.os.Environment.getExternalStorageDirectory() + "/Record/").mkdirs();
}
並將此路徑設置為輸出文件recorder.setOutputFile(android.os.Environment.getExternalStorageDirectory()+"/Record/test.3gp");
對我有用
我敢打賭,有些人會在清單中缺少寫權限。
在主清單標簽中,請確保您具有以下權限:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.