【问题标题】:Android set ringtone works only first timeAndroid设置铃声仅第一次工作
【发布时间】:2012-06-30 23:35:23
【问题描述】:

我的 android 应用程序有一个小问题。我的应用程序中有一些 mp3 文件,我希望能够将其设置为默认铃声或通知。我按照这篇文章Setting Ringtone in Android 上的说明进行操作,效果不错。

这是我的代码:

创建设置为铃声的文件:

public static String createFile(String raw, int choice){
    File newSoundFile = null;
    String path = (choice == 0) ? "/mnt/sdcard/media/mySoundsRingtone.mp3" : "/mnt/sdcard/media/mySoundsNotification.mp3";
    newSoundFile = new File(path);
    if(newSoundFile.exists()){
        try {
            newSoundFile.delete();
        } catch (Exception e) {
            Toast.makeText(cont, "delete failed", Toast.LENGTH_SHORT).show();
            return null;
        }

    }

    try {
        newSoundFile.createNewFile();
    } catch (IOException e) {
        Toast.makeText(cont, "file creation failed", Toast.LENGTH_SHORT).show();
        return null;
    }
    //Toast.makeText(cont, "file created", Toast.LENGTH_SHORT).show();



    Uri mUri = Uri.parse("android.resource://my.package.name/"+raw);

    ContentResolver mCr = cont.getContentResolver();
    AssetFileDescriptor soundFile;
    try {
           soundFile= mCr.openAssetFileDescriptor(mUri, "r");
       } catch (FileNotFoundException e) {
           Toast.makeText(cont, "AssetFileDescriptor failed", Toast.LENGTH_SHORT).show();
           soundFile=null; 
           return 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 (Exception io) {
           Toast.makeText(cont, "copy failed", Toast.LENGTH_SHORT).show();
           return null;
       }

    return path;
}

将文件设置为铃声:

public static void setValues(String path, int choice){
    File newSoundFile = new File(path);

    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/mp3");
       values.put(MediaStore.MediaColumns.SIZE, newSoundFile.length());
       values.put(MediaStore.Audio.Media.ARTIST, R.string.app_name);
       if(choice == 0){
           values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
           values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
       }
       else{
           values.put(MediaStore.Audio.Media.IS_RINGTONE, false);
           values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
       }
       values.put(MediaStore.Audio.Media.IS_ALARM, false);
       values.put(MediaStore.Audio.Media.IS_MUSIC, false);

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


       try {
           if(choice == 0)RingtoneManager.setActualDefaultRingtoneUri(cont, RingtoneManager.TYPE_RINGTONE, newUri);
           else RingtoneManager.setActualDefaultRingtoneUri(cont, RingtoneManager.TYPE_NOTIFICATION, newUri);
       } catch (Throwable t) {
           Log.d("LOG", "catch exception");
       }


}

同时调用:

public static void setRingTone(String raw, int choice){
    setValues(createFile(raw, choice), choice);


}

所以发生的情况是:我第一次选择铃声时会创建新文件,并且声音被正确分配为铃声。如果我再次单击以选择铃声,则旧的铃声文件将被删除并正确重新创建,但它没有设置为铃声(当我被呼叫时,我只会得到振动)。但是,如果我手动删除 .mp3 文件并转到我的应用程序并再次选择铃声,它就可以工作了。为什么当我从代码中删除文件时,它的行为与从文件浏览器中手动删除时不同?

任何想法可能是什么问题?

提前致谢!

【问题讨论】:

标签: android file ringtone


【解决方案1】:

好的,经过几个小时的搜索,我在这篇文章中找到了答案:setting audio file as Ringtone

(我不知道如何将我的问题标记为重复)

【讨论】:

    【解决方案2】:

    对我来说,它第一次不起作用,但从第二次开始就起作用了

    Uri ruri = Uri.parse("content://media/internal/audio/media/37");
    
    try 
    
    {
    
    RingtoneManager.setActualDefaultRingtoneUri(context,RingtoneManager.TYPE_RINGTONE,     
    ruri);
    
    }
    
    catch (Throwable t) 
    
    {
    
    // error handling goes here -- also, use something other than Throwable
    
    }
    
    AudioManager audio = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
    
    audio.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
    
    for (int volumeType: (new int[] { AudioManager.STREAM_SYSTEM,
    
    AudioManager.STREAM_RING, AudioManager.STREAM_NOTIFICATION, AudioManager.STREAM_ALARM   
    }))
    
    {
    
    int maxVolume = audio.getStreamMaxVolume(volumeType);
    
    
    audio.setStreamVolume(volumeType, maxVolume,AudioManager.FLAG_PLAY_SOUND |     
    AudioManager.FLAG_VIBRATE);
    
    audio.setStreamMute(volumeType, false);
    
     audio.setVibrateSetting(volumeType,AudioManager.VIBRATE_SETTING_ON);
    
     }
    
     }
    
     catch (Exception e) 
     {
    
     // TODO: handle exception
    
     }
    
     }
    

    【讨论】:

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