在Android中将原始文件移动到SD卡

时间:2011-08-08 08:37:31

标签: android file-io

我有一个copy an Audio file from raw folder to SD card的方法。它需要两个输入

  • ressound:.ogg Audio Raw file id。
  • 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,则表示存在错误。在我的例子中,该方法在进入FileNotFoundException块时返回false。我找不到为什么!!一切似乎都很好。

如果您问我是否添加了WRITE权限,我将其添加到Manifest文件中的应用程序标记:

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

请帮忙吗?

3 个答案:

答案 0 :(得分:2)

将此用于路径:

string baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
string path = baseDir + File.Separator + "music" + File.Separator + "yourpackagename" + filename;

答案 1 :(得分:0)

请不要硬编码路径。使用Environment.getExternalStorageDirectory()获取大型存储介质的路径。有些手机在/ mnt / sdcard或其他地方安装sdcards,有些只是没有,并依赖内置闪存。

这可能会引发错误,但我不认为是这种情况下的错误,因为您可能正在测试适用此路径的手机/模拟器。

答案 2 :(得分:0)

我的问题与代码无关。这是权限相关的事情。我在application tag内添加了权限。它必须在它之外。它必须位于root tag

连接我,因为将它放在application tag而不是Manifest tag中是有道理的!

感谢您的回答!