2011-05-10 1 views
0

안녕하세요 저는 안드로이드 애플리케이션의 내 res/raw 폴더에있는 파일을 전화의 sdcard에 복사하여 벨소리로 설정할 수 있도록하려고합니다. 여기에 내가 내 응용 프로그램에 지금까지 무엇을 가지고 : 그것은 setRing 방법의 두 번째 시도 캐치를 명중하면안드로이드의 res 파일에서 sdcard로 파일

package com.wochstudios.ringtonetest; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import android.app.*; 
import android.content.ContentResolver; 
import android.content.ContentValues; 
import android.content.res.*; 
import android.app.Activity; 
import android.media.RingtoneManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class setRingtone extends Activity { 
Button setBtn; 
TextView result; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    setBtn = (Button) findViewById(R.id.button1); 
    result = (TextView) findViewById(R.id.textView1); 

    setBtn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      //Attempt to make file out on raw element 
      setRing(); 
     } 
    }); 
} 
public void setRing(){ 
    File newSoundFile = new File("/sdcard/media/ringtone", "fortkickass.mp3"); 
    Uri mUri =   Uri.parse("android.resource://com.wochstudios.ringtonetest/R.raw.fortkickass"); 

    ContentResolver mCr = getContentResolver(); 

    AssetFileDescriptor soundFile; 

    try { 
      soundFile= mCr.openAssetFileDescriptor(mUri, "r"); 
     } catch (FileNotFoundException e) { 
      soundFile=null; 
     } 


     try { 
      byte[] readData = new byte[1024]; 
      FileInputStream fis = soundFile.createInputStream(); 
      FileOutputStream fos = new FileOutputStream(newSoundFile); 
      int i = fis.read(readData); 

      while (i != -1) { 
      fos.write(readData, 0, i); 
      i = fis.read(readData); 
      } 

      fos.close(); 
     } catch (IOException io) { 
     } 





} 

}

이 충돌, '내가 이전에 게시 된 질문에서이 코드를 가지고하지만 난 할 수 t는 링크가 더 이상 도움이 좋을 것 찾을

편집

내가 주위에 속지 그래서 이제 충돌이 발생 내가 null의 이유를 알아 내야 있도록 Assetfiledescriptor 사운드 파일이 null 인 것을 발견

.

답변

3

설명 :

첫 번째 try/catch 블록이 수행합니다 읽기에 실패

soundFile=null; 

합니다.

는 그런 다음 두 번째, 당신은에 사운드 파일 사용이 첫 번째 시도가 실패했기 때문에 당신이 null 읽고

FileInputStream fis = soundFile.createInputStream(); 

편집 :

사용이 대신

InputStream ins = context.getResources().openRawResource (R.raw.FILENAME) 
byte[] buffer = new byte[ins.available()]; 
ins.read(buffer); 
ins.close(); 
String filename = Environment.getExternalStorageDirectory().toString()+File.separator+FILENAME; 
FileOutputStream fos = new FileOutputStream(filename); 
fos.write(buffer); 
fos.close(); 
+0

은 내가 IOException이 @ALeadam '\t 시도 { \t \t의 InputStream 인 = this.getResources() openRawResource (R.raw.fortkickass)를 얻을; \t \t byte [] buffer = 새 바이트 [ins.available()]; \t \t ins.read (버퍼); \t \t ins.close(); \t \t 문자열 파일 이름 = Environment.getExternalStorageDirectory(). toString() + File.separator + "fortkickass.mp3"; \t \t result.setText (filename); \t \t FileOutputStream fos = 새 FileOutputStream (파일 이름); \t \t fos.write (버퍼); \t \t fos.close(); \t \t \t} 캐치 (IOException이 IO) { \t \t result.setText ("아니"); \t} ' – DMcP89

+0

@BeardFace 어디에서 예외가 나옵니까? – Aleadam

+0

메신저 내가 FileOutputStream을 가지고 있다고 생각하는지 모르겠다. 내가 더 이상 @aleaadam – DMcP89

1

Manifest 파일에 쓸 수있는 권한을 설정하는 것을 잊었습니까? .

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