2011-11-29 7 views
0

私は以下のコードを使用して、 "FileNotFound"例外を受け取ります。誰がこれがなぜなのか説明できますか?私はエミュレータを使ってテストしています、2.3.3。カスタム着信音を設定すると、FileNotFound例外が生成されますか?

private void setRingtone(){ 
    byte[] buffer = null; 
    InputStream fIn = getBaseContext().getResources().openRawResource(R.raw.custom_ringtone); 
    int size = 0; 

    try { 
     size = fIn.available(); 
     buffer = new byte[size]; 
     fIn.read(buffer); 
     fIn.close(); 
    } catch (IOException e) { 
     Log.d("trace", "IO 1" + e);   
    } 

    String path = Environment.getExternalStorageDirectory().getPath()+"/media/ringtone/"; 
    String filename = "custom_ringtone.mp3"; 

    boolean exists = (new File(path)).exists(); 
    if (!exists){ 
     new File(path).mkdirs(); 
     Log.d("trace", "path added" + path); 
    }else{ 
     Log.d("trace", "path not added" + path);    
    } 

    FileOutputStream save; 
    try { 
     save = new FileOutputStream(path+filename); 
     save.write(buffer); 
     save.flush(); 
     save.close(); 
    } catch (FileNotFoundException e) { 
     Log.d("trace", "FileNotFound" + e); 
    } catch (IOException e) { 
     Log.d("trace", "IO 2" + e); 
    } 

    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, "Schedule Cheer"); 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); 
    values.put(MediaStore.Audio.Media.ARTIST, "One2MM"); 
    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, false); 

    //Insert it into the database 
    Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()); 
    getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null); 
    Uri newUri = getContentResolver().insert(uri, values); 
    RingtoneManager.setActualDefaultRingtoneUri(MainActivity.this, RingtoneManager.TYPE_RINGTONE, newUri); 

} 
+0

あなたは例外の原因を特定するラインデバッガを使用することはできますか?すべてのファイルパスがエミュレータ上に実際に存在していますか?ファイルシステムに書き込むことができるようにエミュレータを設定しましたか? – ethan

+0

すべての良い質問、ありがとう!私は現在、エミュレータのファイルシステムの設定を調べています。 – worked

答えて

1

外部SDカードに書き込むには、パーミッションを宣言する必要があります。

だけ<manifest>タグの下に、あなたのmanifest.xmlに次の行を追加します

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

うん、それも行方不明だった。私はAVDマネージャのSDカードにも実際の容量のストレージを追加する必要がありました。ありがとう! – worked

関連する問題