簡體   English   中英

錄音的權限問題

[英]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

如何在Android Shell中復制和編輯文件?

寫入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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM