2016-01-03 5 views
0

В одном из моих приложений я хочу добавить возможность для пользователя установить мелодию звонка со звуком из моей папки res/raw.
Поскольку я понятия не имел, как это сделать, я нашел фрагмент кода на этом веб-сайте. Я создал клон моего проекта, и я хочу проверить этот фрагмент кода, прежде чем адаптировать его к моему приложению.
вот код:Проблема установки мелодии звонка

File file = new File(Environment.getExternalStorageDirectory(), 
        "/myRingtonFolder/Audio/"); 
      if (!file.exists()) { 
       file.mkdirs(); 
      } 

      String path = Environment.getExternalStorageDirectory() 
        .getAbsolutePath() + "/myRingtonFolder/Audio/"; 

      File f = new File(path + "/"+ name + ".mp3"); 

      Uri mUri = Uri.parse("android.resource://" 
        + context.getPackageName() + "/raw/" + name); 
      ContentResolver mCr = context.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(f); 
       int i = fis.read(readData); 

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

       fos.close(); 
      } catch (IOException io) { 
      } 
      ContentValues values = new ContentValues(); 
      values.put(MediaStore.MediaColumns.DATA, f.getAbsolutePath()); 
      values.put(MediaStore.MediaColumns.TITLE, name); 
      values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); 
      values.put(MediaStore.MediaColumns.SIZE, f.length()); 
      values.put(MediaStore.Audio.Media.ARTIST, R.string.app_name); 
      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); 

      Uri uri = MediaStore.Audio.Media.getContentUriForPath(f 
        .getAbsolutePath()); 
      Uri newUri = mCr.insert(uri, values); //errror here 

      try { 
       RingtoneManager.setActualDefaultRingtoneUri(context, 
         RingtoneManager.TYPE_RINGTONE, newUri); 
       Settings.System.putString(mCr, Settings.System.RINGTONE, 
         newUri.toString()); 
      } catch (Throwable t) { 

      } 

Проблема заключается в том, я получаю эту ошибку:

FATAL EXCEPTION: main 
                     Process: com.mtoy.tiboxinshape, PID: 27721 
                     java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.FileInputStream android.content.res.AssetFileDescriptor.createInputStream()' on a null object reference 
                      at com.mtoy.tiboxinshape.SoundAdaptateur$2.onLongClick(SoundAdaptateur.java:117) 
                      at android.view.View.performLongClick(View.java:5243) 
                      at android.widget.TextView.performLongClick(TextView.java:9225) 
                      at android.view.View$CheckForLongPress.run(View.java:21127) 
                      at android.os.Handler.handleCallback(Handler.java:739) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5417) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Я знаю, что проблема исходить от этой линии: Uri newUri = mCr.insert(uri, values);. Я попытался добавить разрешение в свой манифест, но я все еще получаю эту ошибку.
Вы можете помочь мне найти проблему.

+0

Кажется, что это вызвано нулевым звуковым файлом. Попробуйте этот подход при получении исходного ресурса - http://stackoverflow.com/questions/16791439/android-how-to-get-uri-from-raw-file (в любом случае вы должны выйти из метода, когда поймаете FileNotFoundException, как null 'soundFile', приведет к исключению исключения из null-указателя иначе). – headuck

ответ