2011-08-08 9 views
0

私にはcopy an Audio file from raw folder to SD cardの方法があります。 2つの入力が必要です。RAWファイルをAndroidのSDカードに移動

  • ressound:.ogg Audio RawファイルID。
  • fName:SDカード内のRAWファイルのファイル名。

は、メソッドがtrueを返した場合は、次にファイルを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; 
    } 

を更新しました。 falseを返すと、エラーが発生します。私の場合、このメソッドはブロックFileNotFoundExceptionに入るとfalseを返します。私はなぜ見つけることができません!すべてが私にとってうまいようです。私はWRITE権限を追加した場合、あなたが私に尋ねる場合

、私は、マニフェストファイル内のアプリケーションタグにこれを追加しました:

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

すべてのヘルプをしてください?

+0

デバイスに依存しない方法でSDカードディレクトリを取得するには、 'File f = Environment.getExternalStorageDirectory();'を使用することを検討してください。 – Im0rtality

答えて

0

私の問題はコードとは関係ありません。 許可関連ものです。私はapplication tagの中に許可を加えました。それは外になければなりません。それはroot tagにある必要があります。

Manifest tagではなくapplication tagに入れておくと意味があるので私のために配線されています!

ありがとうございました!

2

は、パスのためにこれを使用します。

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

だから?何をお勧めしますか? – iTurki

+0

'パス=パス+ファイル名;'を '' save '= new FileOutputStream(path); ' –

+0

と宣言できます。同じエラーが表示されます! – iTurki

0

パスをハードコードしないでください。大きな記憶メディアのパスを取得するには、Environment.getExternalStorageDirectory()を使用します。いくつかの電話機は/ mnt/sdcardやその他の場所にsdcardをマウントしているものもあれば、内蔵されていないものもあります。

これはエラーが発生する可能性がありますが、このパスが適用される電話機/エミュレータでテストしている可能性があるため、この場合はエラーではないと思います。