2012-06-30 211 views
2

我已阅读这2帖子link1和这一个link2但代码似乎不适用于我。将原始资源设置为铃声

这里是我的代码:

File newSoundFile = new File("/sdcard/media/ringtone", "myringtone.oog"); 
      Uri mUri = Uri.parse("android.resource://com.pack.android.myapp/R.raw.song1"); 
      ContentResolver mCr = Main.this.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) { 
       } 
       ContentValues values = new ContentValues(); 
       values.put(MediaStore.MediaColumns.DATA, newSoundFile.getAbsolutePath()); 
       values.put(MediaStore.MediaColumns.TITLE, "my ringtone"); 
       values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/oog"); 
       values.put(MediaStore.MediaColumns.SIZE, newSoundFile.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, false); 

       Uri uri = MediaStore.Audio.Media.getContentUriForPath(newSoundFile.getAbsolutePath()); 
       Uri newUri = mCr.insert(uri, values); 


       try { 
        RingtoneManager.setActualDefaultRingtoneUri(Main.this, RingtoneManager.TYPE_RINGTONE, newUri); 
       } catch (Throwable t) { 
        // Log.d(TAG, "catch exception"); 
       } 

,我得到一个强制关闭。 Logcat在这里:

06-30 03:13:03.731: E/AndroidRuntime(4187): FATAL EXCEPTION: main 
06-30 03:13:03.731: E/AndroidRuntime(4187): java.lang.NullPointerException 
06-30 03:13:03.731: E/AndroidRuntime(4187):  at com.pack.android.myapp.Main.Music(Main.java:83) 
06-30 03:13:03.731: E/AndroidRuntime(4187):  at com.pack.android.myapp.Main$2.onClick(Main.java:46) 
06-30 03:13:03.731: E/AndroidRuntime(4187):  at android.view.View.performClick(View.java:2538) 
06-30 03:13:03.731: E/AndroidRuntime(4187):  at android.view.View$PerformClick.run(View.java:9152) 
06-30 03:13:03.731: E/AndroidRuntime(4187):  at android.os.Handler.handleCallback(Handler.java:587) 
06-30 03:13:03.731: E/AndroidRuntime(4187):  at android.os.Handler.dispatchMessage(Handler.java:92) 
06-30 03:13:03.731: E/AndroidRuntime(4187):  at android.os.Looper.loop(Looper.java:130) 
06-30 03:13:03.731: E/AndroidRuntime(4187):  at android.app.ActivityThread.main(ActivityThread.java:3687) 
06-30 03:13:03.731: E/AndroidRuntime(4187):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-30 03:13:03.731: E/AndroidRuntime(4187):  at java.lang.reflect.Method.invoke(Method.java:507) 
06-30 03:13:03.731: E/AndroidRuntime(4187):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
06-30 03:13:03.731: E/AndroidRuntime(4187):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
06-30 03:13:03.731: E/AndroidRuntime(4187):  at dalvik.system.NativeStart.main(Native Method) 

soundFile似乎为空。这是为什么?我的歌曲是song1.mpe,位于res下的原始文件夹中。

权限在清单中增加:

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

给出的答案适用于你?@ ghostrider – Erum

回答

2

放入资产文件夹铃声的声音,并使用此代码

Uri path = Uri.parse("android.resource://yourpackagename/raw/yoursoundfile") 
RingtoneManager.setActualDefaultRingtoneUri(
        getApplicationContext(), RingtoneManager.TYPE_RINGTONE, 
        path); 
      Log .i("TESTT", "Ringtone Set to Resource: "+ path.toString()); 
      RingtoneManager.getRingtone(getApplicationContext(), path) 
        .play(); 

此权限加入AndroidManifest.xml中:

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

它也不适用于我。它设置为我的手机的默认声音铃声,我也得到一个关闭空指针例外的力量。 – ghostrider

+2

uri字符串在铃声资源文件夹中放置错误。如上所述,铃声需要位于res/** raw **文件夹中。 如果您将铃声放置在资产文件夹中,则uri字符串应为: “android.resource:// yourpackagename/** assets **/yoursoundfile”) – Baron

+0

@Baron是否需要将铃声保存到存储中之前可以真正玩它吗? – Roylee

0

这是我使用的代码!对我来说非常有帮助,特别是这个tutorial

String exStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath(); 
String path=(exStoragePath +"/media/alarms/"); 

saveas(RingtoneManager.TYPE_RINGTONE); 

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+path+filename+".mp3" 
     + Environment.getExternalStorageDirectory()))); 


File k = new File(path, filename); 

ContentValues values = new ContentValues(4); 
long current = System.currentTimeMillis(); 
values.put(MediaStore.MediaColumns.DATA, path + filename ); 
values.put(MediaStore.MediaColumns.TITLE, filename); 
values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current/1000)); 
values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp"); 

//new 
values.put(MediaStore.Audio.Media.ARTIST, "cssounds "); 
values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false); 
values.put(MediaStore.Audio.Media.IS_ALARM, true); 
values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

// Insert it into the database 
this.getContentResolver() 
.insert(MediaStore.Audio.Media.getContentUriForPath(k 
.getAbsolutePath()), values); 

HAPPY CODING!