Переместить файл Raw на SD-карту в Android - PullRequest
0 голосов
/ 08 августа 2011

У меня есть метод, который будет copy an Audio file from raw folder to SD card. Требуется два входа

  • ressound: идентификатор файла .ogg Audio Raw.
  • fName: имя файла необработанного файла на SD-карте.

Обновлено

     public boolean saveas(int ressound, String fName){  
     byte[] buffer=null;  
     InputStream fIn = getBaseContext().getResources().openRawResource(ressound);  
     int size=0;  

     try {  
      size = fIn.available();  
      buffer = new byte[size];  
      fIn.read(buffer);  
      fIn.close();  
     } catch (IOException e) {  
      // TODO Auto-generated catch block 
      return false;  
     }  

     String path="/sdcard/music/[my_package_name]/"; 
     String filename=fName+".ogg";
     String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
     String completePath = baseDir + File.separator + "music" + File.separator + "my_package" + File.separator + filename;


     boolean exists = (new File(completePath)).exists();  
     if (!exists){new File(completePath).mkdirs();}  

     FileOutputStream save;  
     try {  
      save = new FileOutputStream(completePath);  
      save.write(buffer);  
      save.flush();  
      save.close();  
     } catch (FileNotFoundException e) {  
      // TODO Auto-generated catch block  
      return false;
     } catch (IOException e) {  
      // TODO Auto-generated catch block 
      return false;  
     }      

     sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://"+path+filename)));  

     File k = new File(path, filename);  

     ContentValues values = new ContentValues();  
     values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());  
     values.put(MediaStore.MediaColumns.TITLE, "exampletitle");  
     values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg");  
     values.put(MediaStore.Audio.Media.ARTIST, "cssounds ");  
     values.put(MediaStore.Audio.Media.IS_RINGTONE, true);  
     values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);  
     values.put(MediaStore.Audio.Media.IS_ALARM, true);  
     values.put(MediaStore.Audio.Media.IS_MUSIC, true);  

     //Insert it into the database  
     this.getContentResolver().insert(MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()), values);  

     return true;  
    } 

Если метод возвращает true, тогда файл правильно сохраняется на SD-карту. Если он возвращает false, то есть ошибка. В моем случае метод возвращает false, когда входит в блок FileNotFoundException. Я не могу найти почему !! мне все кажется хорошо.

Если вы спросите меня, добавляю ли я разрешение на ЗАПИСЬ, я добавлю его в тег приложения в файле манифеста:

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

Любая помощь, пожалуйста?

Ответы [ 3 ]

2 голосов
/ 08 августа 2011

Используйте это для пути:

string baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
string path = baseDir + File.Separator + "music" + File.Separator + "yourpackagename" + filename;
0 голосов
/ 10 августа 2011

Моя проблема не имеет ничего общего с кодом.Это вещь, связанная с разрешениями .Я добавил разрешение внутри application tag.Это должно быть за его пределами.Это должно быть в root tag.

Для меня, потому что имеет смысл поместить его в application tag, а не Manifest tag!

Спасибо за ваши ответы!

0 голосов
/ 08 августа 2011

Пожалуйста, не указывайте жесткие пути.Используйте Environment.getExternalStorageDirectory () , чтобы получить путь к большой среде хранения.Некоторые телефоны монтируют sdcards в / mnt / sdcard или где-то еще, некоторые просто не имеют и используют встроенную флэш-память.

Это может привести к ошибке, но я не думаю, что это ошибка в этом случае, так как вы, вероятно, тестируете свой телефон / эмулятор, где применяется этот путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...