Разрешение на запись на SD-карту Android - PullRequest
4 голосов
/ 13 октября 2010

У меня проблема с записью на SD-карту, вот код: (Извините за компоновку кода, просто скопируйте его)

public class SaveAndReadManager {

 private String result;
 private String saveFileName = "eventlist_savefile";

 public String writeToFile( ArrayList<Event> arrlEvents ){
  FileOutputStream fos = null;
  ObjectOutputStream out = null;

  try{
   File root = Environment.getExternalStorageDirectory();

   if( root.canWrite() ){
    fos = new FileOutputStream( saveFileName );
    out = new ObjectOutputStream( fos );
    out.writeObject( arrlEvents );

    result = "File written";

    out.close();
   }else{
    result = "file cant write";
   }
  }catch( IOException e ){
   e.printStackTrace();
   result = "file not written";
  }

  return result;
 }

 public boolean readFromFile(){
  return false;
 }
}

Я еще не реализовал readFromFile (),Проблема в том, что root.canWrite () возвращает false все время.Вот файл манифеста:

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

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".InfoScreen"
           android:label="@string/app_name">
      <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

    <activity android:name=".EventCalendar"
              android:label="@string/app_name" />

    <activity android:name=".MakeEvent"
              android:label="@string/app_name" />

    <activity android:name=".ViewEvent"
              android:label="@string/app_name" />

</application>
<uses-sdk android:minSdkVersion="8" />

Я попросил разрешения на запись, и на моем AVD, если я иду в настройки -> SD-карта и память телефона, он говорит мне, что у меня есть 1 ГБ на SD-карте для записи.Пожалуйста, помогите.

Спасибо:)

Ответы [ 4 ]

6 голосов
/ 13 октября 2010

Попробуйте проверить состояние SD-карты перед попыткой записи на нее.Он может использоваться как общий диск, поврежден, заполнен и т. Д. Список состояний можно найти здесь: http://developer.android.com/reference/android/os/Environment.html

Вот пример получения состояний:

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;
    }
3 голосов
/ 13 октября 2010

Какой результат вы видите откатом в writeToFile? "файл не записан" или "файл не может написать"?

Когда я запустил ваш код, он упал в блок catch IOException с результатом "файл не записан". Причиной этого было то, что fos был определен неправильно:

fos = new FileOutputStream( saveFileName );

должно быть:

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

После того, как я изменил эту строку, я получил результат «Файл записан», возвращенный из writeToFile.

0 голосов
/ 13 октября 2010

Я должен был также включить следующую ссылку (поскольку именно там я получил код, который записывает на SD-карту ...):

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

0 голосов
/ 13 октября 2010

Я использую следующий код для записи аудиоданных (успешно) на SD-карту моего Android. Моему приложению требуется разрешение RECORD_AUDIO, но больше ничего.

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");
}

Мне кажется, что вам не хватает вызова getAbsolutePath (), добавленного к вашему вызову getExternalStorageDirectory () (который может иметь тот же результат, что и жестко кодированное решение Марка Бернштейна).

...