2011-01-13 37 views
0

我在設備上錄製聲音時遇到了一些問題。如果從Android開發人員網站(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) 

而且我也有我的清單設置以下權限。 xml文件:

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

回答

8

愚蠢的錯誤在這裏對不起,它沒有工作,因爲我的手機安裝在我的筆記本電腦,所以它實際上無法達到SD卡。

3

對於錯誤2:嘗試使用getExternalStorageDirectory(),而不是「SD卡」靜態,也許路徑無效/到達您的設備上。

1

對於那些偶然發現的問題,異常並不總是告訴你FileNotFoundException與拒絕權限相關聯。檢查您的AndroidManifest.xml中是否存在權限WRITE_EXTERNAL_STORAGE。在OP的情況下,它的確如此。

即使您創建一個外部SD卡文件(使用mksdcard命令)並將其與手機關聯,對getExternalStorageDirectory()的調用仍可能指向/ sdcard(因爲該方法的合同不能保證它會返回一個非內部存儲位置)。您始終可以使用'adb shell'命令來檢查sdcard是否存在。如果你想從SD卡複製文件,使用'adb pull'/'adb push'命令。

參考文獻:

http://developer.android.com/guide/developing/devices/emulator.html#sdcard

How to copy and edit files in Android shell?

writing to sdcard not working

1

不要在輸出文件中未鐵桿/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");

它的作品對我來說

1

我敢打賭,一些人失蹤寫權限的清單。

在主清單標籤,請確保您有以下權限:

<uses-permission android:name="android.permission.RECORD_AUDIO"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>