5

这是一个简单的问题,可能是一个简单的答案,但有大量的上下文。

问题:setActualDefaultRingtoneUri()在 API 23中仍然有效吗?因为我无法让它发挥作用

上下文: 我已经设置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;
    }
}

然后我有一个简单的 2 按钮演示:一个有这个(不起作用)

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();

有人可以向我解释为什么,当添加了 2 个权限并且meepmeep.mp3在 res 文件夹中时,为什么事件会触发以在应用程序中播放声音但没有分配铃声RingtoneManager.setActualDefaultRingtoneUri

4

1 回答 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,如果你现在有写权限,那么你需要重新设置铃声,这不是自动的。

于 2017-06-14T06:48:49.317 回答