在API 23中,RingtoneManager.setActualDefaultRingtoneUri()有效吗?

6

这是一个简单的问题,也许有一个简单的答案,但是需要大量的背景知识。

问题:在API 23中,setActualDefaultRingtoneUri()是否仍然有效?因为我无法让它正常工作。

背景: 我已经使用AndroidManifest.xml进行了设置。

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

该应用程序使用以下代码自动分配权限。
public void desirePermissionCode()
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.System.canWrite(this)) {
        new AlertDialog.Builder(this)
                .setMessage("Please Assign Meep Meep Write Permissions")
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
                        intent.setData(Uri.parse("package:" + getPackageName()));
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                        try {
                            startActivity(intent);
                        } catch (Exception e) {
                            Log.e("MainActivity", "error starting permission intent", e);
                        }
                    }
                })
                .show();
        return;
    }
}

我随后会展示一个简单的两个按钮的演示:其中一个是这样的(不起作用)
Uri uri = Uri.parse("android.resource://" + getPackageName() + "/raw/meepmeep");
grantUriPermission("com.android.systemui", uri,
                   Intent.FLAG_GRANT_READ_URI_PERMISSION);
RingtoneManager.setActualDefaultRingtoneUri(
          MainActivity.this,
          RingtoneManager.TYPE_RINGTONE,
          uri
 );

并且有一个这样的(能够工作)

MediaPlayer mpintro;
mpintro = MediaPlayer.create(me, Uri.parse("android.resource://"+getPackageName()+"/raw/meepmeep"));
mpintro.start();

有人能解释一下,为什么当添加了两个权限并且 meepmeep.mp3 在 res 文件夹中时,应用程序触发播放声音的事件,但不能将铃声指定为 RingtoneManager.setActualDefaultRingtoneUri

1个回答

2
请参考此链接:https://developer.android.com/reference/android/Manifest.permission.html#WRITE_SETTINGS 如果应用程序的目标API级别为23或更高,则必须通过权限管理屏幕向应用程序用户明确授予此权限。应用程序通过发送带有ACTION_MANAGE_WRITE_SETTINGS操作的意图来请求用户的批准。应用程序可以通过调用Settings.System.canWrite()来检查是否具有此授权。
请不要使用startActivity(intent),而是请使用startActivityForResult来监听MANAGE_WRITE_SETTINGS活动的反馈。在onActivityResult方法中,您可以检查请求代码并再次检查Settings.System.canWrite,如果现在具有写入权限,则需要重新设置铃声,这不是自动的。

是的,示例代码“清楚地”展示了我这样做,谢谢,但它不起作用。 - Mr Heelis
@MrHeelis,请不要使用startActivity(intent),而是请使用startActivityForResult来监听MANAGE_WRITE_SETTINGS活动的反馈。在onActivityResult方法中,您可以检查请求代码并再次检查Settings.System.canWrite,如果现在具有写入权限,则需要重新设置铃声,这不是自动的。 - Hexise
@MrHeelis 顺便问一下,你能否尝试从手机外部存储设置铃声,而不是使用原始资源?我不确定这是否是问题的原因。 - Hexise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接