Permission to write on SD card android

戏子无情 提交于 2019-11-30 07:37:59

Which result are you seeing retunred from writeToFile? "file not written" or "file cant write"?

When I ran your code it dropped into the catch IOException block with the result of "file not written". The reason for this was that fos was defined incorrectly:

fos = new FileOutputStream( saveFileName );

should be:

fos = new FileOutputStream( root + "/" saveFileName );

After I changed this line, I got the result "File written" returned from writeToFile.

Try checking the state of the SD card before you attempt to write to it. It may be used as a shared drive, corrupted, full, etc. A list of states can be found here: http://developer.android.com/reference/android/os/Environment.html

Here's an example of getting the states:

String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        mExternalStorageAvailable = mExternalStorageWriteable = true;
    } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        mExternalStorageAvailable = true;
        mExternalStorageWriteable = false;
    } else {
        mExternalStorageAvailable = mExternalStorageWriteable = false;
    }

I use the following code to record audio data (successfully) to my Android's SD Card. My application requires the RECORD_AUDIO permission, but nothing else.

File file = new File (Environment.getExternalStorageDirectory().getAbsolutePath() + FILE_NAME);

if (file.exists())
    file.delete();                                                          //  Delete any previous recording

try
{
    file.createNewFile();                                                   //  Create the new file
}
catch (IOException e)
{
    Log.e (TAG, "Failed to create " + file.toString());
}

try
{
    OutputStream            os  = new FileOutputStream      (file);
    BufferedOutputStream    bos = new BufferedOutputStream  (os, 8000);
    DataOutputStream        dos = new DataOutputStream      (bos);          //  Create a DataOutputStream to write the audio data to the file

    // Create an AudioRecord object to record the audio
    int          bufferSize     = AudioRecord.getMinBufferSize (frequency, channelConfig, Encoding);
    AudioRecord  audioRecord    = new AudioRecord (MediaRecorder.AudioSource.MIC, frequency, channelConfig, Encoding, bufferSize);

    short[] buffer = new short[bufferSize];                                 //  Using "short", because we're using "ENCODING_PCM_16BIT"    
    audioRecord.startRecording();

    while (isRecording)
    {
        int bufferReadResult = audioRecord.read (buffer, 0, bufferSize);
        for (int i = 0; i < bufferReadResult; i++)
            dos.writeShort (buffer[i]);
    }

    audioRecord.stop();
    dos.close();
}
catch (Exception t)
{
    Log.e (TAG, "Recording Failed");
}

It would appear to me that you're missing the getAbsolutePath() call appended to your getExternalStorageDirectory() call (which may have the same result as Marc Bernstein's hard coded solution).

I should have included the following link as well (since it's where I got the code that writes to the SD Card...):

http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!