Android设置铃声和闹钟使用的方法是一样的,但是要区别的去获取对应的权限。
统一权限,不管是设置闹钟还是铃声,他们都需要一个系统设置权限如下:
//高版本需要WRITE_SETTINGS权限
//此权限是敏感权限,无法动态申请,需要跳转到系统界面开启
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//判断是否已经开启权限
if (!Settings.System.canWrite(mContext)) {
//没有开启这里需要一个弹窗来提醒用户要去设置下这个权限
//自己的demo可以忽略此步骤,应用商店权限申请前需要说明
mBindView.tvTitle.post {
//这是我自己的权限说明弹窗,自己的定义即可
OpenWriteDialog.show(this.supportFragmentManager){
if (it){
//这一步是跳转到系统设置界面,跳转之后有个回调,判断是否已经开启,开启了继续处理下一步
val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS)
intent.data = Uri.parse("package:$packageName")
startActivityForResult(intent, PERMISSION_LOCAL_CODE)
}
}
}
} else {
//开启了运行下一步
todo()
}
} else {
//低版本直接运行下一步
todo()
}
@RequiresApi(Build.VERSION_CODES.M)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
//回调判断code是否一致
if (requestCode == PERMISSION_LOCAL_CODE){
//判断是否已经开启
if (Settings.System.canWrite(this)) {
//开启了进行下一步
todo()
}
}
}
设置铃声或者闹钟前都要先进行上一步的权限判断才可以继续进行
设置闹钟
首先动态判断权限
Manifest.permission.SET_ALARM
Manifest.permission.READ_EXTERNAL_STORAGE
Manifest.permission.WRITE_EXTERNAL_STORAGE
然后调用代码即可
RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_ALARM, uri)
注意这里的uri是手机本地的铃声路径,大多数的需求是下载网络.mp3 铃声到本地,然后更新闹钟,这里注意下下载之后需要更新到媒体库才可以正常设置,否则设置出来可能是未知或者直接设置不成功----------如何下载更新到媒体库后面统一讲
设置铃声
同闹钟一样,首先需要动态获取权限
Manifest.permission.READ_EXTERNAL_STORAGE
Manifest.permission.WRITE_EXTERNAL_STORAGE
其次设置铃声即可
RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, uri)
这里的uri同闹钟一样,需要更新到媒体库才可以设置
下载网页铃声到本地
DownloadUtil.download("网页链接","存储路径", "文件名称.mp3",
object : DownloadUtil.OnDownloadListener{
override fun onDownloadSuccess(file: File?) {
//下载成功以及下载后的文件
}
override fun onDownloading(progress: Int) {
//下载进度
}
override fun onDownloadFailed(e: Exception?) {
//下载失败
}
})
存储路径地址这里给出建议写法
private fun getUrlPath(): String {
val externalFilesDir: File? = this.getExternalFilesDir("")
val customFile = File(externalFilesDir!!.absolutePath, "Sandbox")
if (!customFile.exists()) {
customFile.mkdirs