Android实现自定义铃音

不知道大家知道不知道,Android手机设置铃音这个功能跟其他手机平台不太一样,其他平台设置的时候一般可以浏览本地铃音库或者曲库,然后选中即可设置。而Android中不行,它只有手机出厂时内置的几种铃音可选。这个我觉得做的不是很好,给用户的体验不高,不够人性化。一个用户如果想设置自己下载的铃音,现在一般有两种方法。
第一种:使用第三方软件设置,这种缺点就是每次设置时都需要打开这个软件。
第二种:比较死的方法,在sd卡里建立一个media的文件夹,再在这个文件夹里面建立名为audio的文件夹,最后再在audio文件夹里建立三个文件夹,分别是notifications(放置在这个文件夹里的铃声可以设置短信音)、ringtones(这个用于设置来电铃声)、ALARMS(这个用于设置闹铃声),把你不同用途的铃声放到不同的文件夹下手机就可以自动找到。
那么第三方软件是怎么实现设置的呢?先看一下效果:
设置之前:


设置之后:

代码实现起来也比较简单,里面有注释:
Activity:

package org.sunchao; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class RingtoneSettingActivity extends Activity { private Button setting; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setting = (Button) findViewById(R.id.setting); setting.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 外部调用传入一个url RingtoneSetting.setmUrl(Environment .getExternalStorageDirectory().toString() + "/Music/胡歌-忘记时间.mp3"); // 开始设置 RingtoneSetting.setting(RingtoneSettingActivity.this); } }); } } 供外部调用的实现类:
package org.sunchao; import java.io.File; import android.content.ContentValues; import android.content.Context; import android.media.RingtoneManager; import android.net.Uri; import android.provider.MediaStore; public class RingtoneSetting { private static String mUrl; private static Context mContext; public static void setmUrl(String url) { mUrl = url; } public static void setting(Context context) { // 外部调用者传来的context mContext = context; // 设置歌曲路径 File filePath = new File(mUrl); ContentValues values = new ContentValues(); // The data stream for the file values.put(MediaStore.MediaColumns.DATA, filePath.getAbsolutePath()); // The title of the content values.put(MediaStore.MediaColumns.TITLE, filePath.getName()); // The MIME type of the file values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); // values.put(MediaStore.Audio.Media.ARTIST, "Madonna"); // values.put(MediaStore.Audio.Media.DURATION, 230); // 来电铃声 // 第二个参数若是true则会在铃音库中显示 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); // Insert it into the database Uri uri = MediaStore.Audio.Media.getContentUriForPath(filePath .getAbsolutePath()); // 下面这一句很重要 mContext.getContentResolver().delete( uri, MediaStore.MediaColumns.DATA + "=\"" + filePath.getAbsolutePath() + "\"", null); Uri newUri = mContext.getContentResolver().insert(uri, values); RingtoneManager.setActualDefaultRingtoneUri(mContext, RingtoneManager.TYPE_RINGTONE, newUri); } } 上面代码中注释“// 下面这一句很重要”,刚开始我是没加这一句,但是会出现如下错误,08-12 22:11:13.486: ERROR/Database(2974): Error inserting is_alarm=falseis_ringtone=true artist_id=37 is_music=false album_id=-1 title=tl.mp3duration=230 is_notification=false title_key=Ttlmp3 mime_type=audio/mp3date_added=1313158273 _display_name=tl.mp3 _size=8474325_data=/sdcard/Music/tl.mp3
至于原因,我在这里找到了答案,主要看这个回答:
Remember to be careful about testing this code! It only truthfully works the first time. If you try running the same code again, you'll be trying to shove a duplicate entry in MediaStore's table, and the SQLite database won't allow you, giving you that exact same error. You have to either rename your file and add another instance of it, or go in, remove the entry, and then try again. To do this, you could use RingDroid. Just make sure you have all audio visible, and search for your filename, then delete it from there. Alternately, you could look at their source for deleting from the table.


最后不要忘记加权限:
<uses-permission android:name="android.permission.WRITE_SETTINGS"></uses-permission>

http://stackoverflow.com这个网站还是很强大的呀,Android很多FAQ可以在上面得到解决。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中,你可以通过自定义闹钟铃声来为闹钟添加个性化的铃声。下面是一些步骤供你参考: 1. 在你的项目中创建一个 `raw` 文件夹(如果不存在的话)。 2. 将你的自定义铃声文件拷贝到 `raw` 文件夹中。你可以使用任何格式的音频文件,如 MP3、WAV 等。 3. 在你的 `AlarmReceiver` 或者 `AlarmService` 中,使用 `MediaPlayer` 或者 `Ringtone` 类来播放自定义铃声。 - 使用 `MediaPlayer` 类播放自定义铃声的示例代码: ```java MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.custom_ringtone); mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); mediaPlayer.setLooping(true); // 设置循环播放 mediaPlayer.start(); // 开始播放铃声 ``` - 使用 `Ringtone` 类播放自定义铃声的示例代码: ```java Uri ringtoneUri = Uri.parse("android.resource://" + context.getPackageName() + "/raw/custom_ringtone"); Ringtone ringtone = RingtoneManager.getRingtone(context, ringtoneUri); ringtone.play(); // 播放铃声 ``` 4. 确保在适当的时机停止播放铃声,例如用户停止闹钟或者闹钟时间到达。 - 使用 `MediaPlayer` 类停止播放铃声的示例代码: ```java if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.stop(); // 停止播放铃声 mediaPlayer.release(); // 释放 MediaPlayer 资源 } ``` - 使用 `Ringtone` 类停止播放铃声的示例代码: ```java if (ringtone != null && ringtone.isPlaying()) { ringtone.stop(); // 停止播放铃声 } ``` 这些步骤可以帮助你在 Android实现自定义闹钟铃声。记得根据你的具体需求进行适当的调整和扩展。祝你好运!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值