android 6.0 获得静音权限流程

今天看完郭神关于M版本运行权限的视频,突然想到何不把最近项目中关于N版本适配的内容总结一下,和大家分享,下面几个问题有两个前提:手机是N系统以及Gradle中targetSDK配置为24。

setRingerMode(int ringerMode)

首先,我先卖个关子,大家先看下下面代码有什么问题没有:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
                audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
            }
        });
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

代码很简单,主界面上一个button,点击之后启动静音模式,在N之前的版本,这样做是没问题的,但是在N版本上,会出现Fatal Exception。

com.example.saberhao.newfeatures E/AndroidRuntime: FATAL EXCEPTION: main                                                                           
Process: com.example.saberhao.newfeatures, PID: 23714                                                                              
java.lang.SecurityException: Not allowed to change Do Not Disturb state                                                                               
at android.os.Parcel.readException(Parcel.java:1693)                                                                                   
at android.os.Parcel.readException(Parcel.java:1646)                                                                                   
at android.media.IAudioService$Stub$Proxy.setRingerModeExternal(IAudioService.java:1264)                                                                                  
at android.media.AudioManager.setRingerMode(AudioManager.java:1311)                                                                                   
at com.example.saberhao.newfeatures.MainActivity.onClick(MainActivity.java:27)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在 API 24 上,有如下说明

From N onward, ringer mode adjustments that would toggle Do Not Disturb are not allowed unless the app has been granted Do Not Disturb Access. See isNotificationPolicyAccessGranted().

从N版本之后,App必须取得勿打扰权限才能使用setRingerMode去更改铃声状态,通过isNotificationPolicyAccessGranted() 可以判断当前是否已经获得这个权限

那么我们怎么获取勿打扰权限呢,API里也有说明:

Request policy access by sending the user to the activity that matches the system intent action ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS.

发送intent进行请求,这个权限的申请和M版本是有区别的,下面给出完整的方案: 
1.在Androidmenifest.xml中声明权限

<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY"/>
  • 1

2.在改变铃声状态前加入权限判断和申请逻辑

NotificationManager notificationManager = (NotificationManager)getApplicationContext.getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
                && !notificationManager.isNotificationPolicyAccessGranted()) {
                Intent intent = new Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
                getApplicationContext().startActivity(intent);
                return;
            }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

加入权限判断后,会启动如下页面进行权限请求:

这里写图片描述

在获得权限之后,就可以对系统铃声状态进行更改。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值