【问题标题】:Set ringtone from res/raw folder从 res/raw 文件夹设置铃声
【发布时间】:2016-05-29 17:35:45
【问题描述】:

我正在尝试以编程方式将/res/raw/ 文件夹中的音频文件设置为默认铃声。我有如下文件:myapp/res/raw/file.mp3

我有以下代码,但不幸的是完全无法设置铃声。我不确定是什么导致了这个问题,但想知道是否有人有任何见解可以分享。

Uri path = Uri.parse("android.resource://com.mikan.myapp/res/raw/file.mp3");
        RingtoneManager.setActualDefaultRingtoneUri(
                getApplicationContext(), RingtoneManager.TYPE_RINGTONE,
                path);
        Log.i("TESTT", "Ringtone Set to Resource: "+ path.toString());
        RingtoneManager.getRingtone(getApplicationContext(), path)
                .play();

我收到以下异常(在RingtoneManager 中捕获,看起来好像什么都没发生:

03-25 20:20:23.024: D/MediaPlayer(24659): setDataSource IOException happend : 
03-25 20:20:23.024: D/MediaPlayer(24659): java.io.FileNotFoundException: More than two path segments: android.resource://com.mikan.myapp/res/raw/file.mp3
03-25 20:20:23.024: D/MediaPlayer(24659):   at android.content.ContentResolver.getResourceId(ContentResolver.java:861)
03-25 20:20:23.024: D/MediaPlayer(24659):   at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:653)
03-25 20:20:23.024: D/MediaPlayer(24659):   at android.media.MediaPlayer.setDataSource(MediaPlayer.java:979)
03-25 20:20:23.024: D/MediaPlayer(24659):   at android.media.MediaPlayer.setDataSource(MediaPlayer.java:933)
03-25 20:20:23.024: D/MediaPlayer(24659):   at android.media.Ringtone.setUri(Ringtone.java:228)
03-25 20:20:23.024: D/MediaPlayer(24659):   at android.media.RingtoneManager.getRingtone(RingtoneManager.java:647)
03-25 20:20:23.024: D/MediaPlayer(24659):   at android.media.RingtoneManager.getRingtone(RingtoneManager.java:628)
03-25 20:20:23.024: D/MediaPlayer(24659):   at com.mikan.myapp.CustomApp.saveas(CustomApp.java:139)
03-25 20:20:23.024: D/MediaPlayer(24659):   at com.mikan.myapp.ListAdapter$1.onClick(ListAdapter.java:83)
03-25 20:20:23.024: D/MediaPlayer(24659):   at android.view.View.performClick(View.java:4475)
03-25 20:20:23.024: D/MediaPlayer(24659):   at android.view.View$PerformClick.run(View.java:18786)
03-25 20:20:23.024: D/MediaPlayer(24659):   at android.os.Handler.handleCallback(Handler.java:730)
03-25 20:20:23.024: D/MediaPlayer(24659):   at android.os.Handler.dispatchMessage(Handler.java:92)
03-25 20:20:23.024: D/MediaPlayer(24659):   at android.os.Looper.loop(Looper.java:137)
03-25 20:20:23.024: D/MediaPlayer(24659):   at android.app.ActivityThread.main(ActivityThread.java:5419)
03-25 20:20:23.024: D/MediaPlayer(24659):   at java.lang.reflect.Method.invokeNative(Native Method)
03-25 20:20:23.024: D/MediaPlayer(24659):   at java.lang.reflect.Method.invoke(Method.java:525)
03-25 20:20:23.024: D/MediaPlayer(24659):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
03-25 20:20:23.024: D/MediaPlayer(24659):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
03-25 20:20:23.024: D/MediaPlayer(24659):   at dalvik.system.NativeStart.main(Native Method)
03-25 20:20:23.024: D/MediaPlayer(24659): Couldn't open file on client side, trying server side

【问题讨论】:

    标签: android ringtone


    【解决方案1】:

    您不能从资源设置铃声。

    RingtoneManager.setActualDefaultRingtoneUri 需要设备中的铃声文件,并且 Uri 应该来自内容解析器。

     File ring = new File("pathOfYourFile");
     Uri path = MediaStore.Audio.Media.getContentUriForPath(ring.getAbsolutePath());
     RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_RINGTONE,path);
    

    还要确保添加权限

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

    【讨论】:

      【解决方案2】:

      请尝试这个问题的解决方案here

      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);
      
              try {
                  RingtoneManager.setActualDefaultRingtoneUri(context,
                          RingtoneManager.TYPE_RINGTONE, newUri);
                  Settings.System.putString(mCr, Settings.System.RINGTONE,
                          newUri.toString());
              } catch (Throwable t) {
      
              }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多