首页 > 解决方案 > 不允许更改请勿打扰状态,在 Worker 中使用 AudioManager setRingerMode(int i)

问题描述

我正在使用 AudioManager 和 setRingerMode 以编程方式调整铃声。这是通过 Worker 完成的。

public class SettingWorker extends Worker {

    /**
     * Tag of the class
     */
    static final private String TAG = "SettingWorker";

    Context mContext;

    /**
     * Constructor of the worker
     * @param context context of the application
     * @param workerParams ..
     */
    public SettingWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
        mContext = context;
    }

    @NonNull
    @Override
    public Result doWork() {        
        setSetting("SLT");    
        Logger.logD(TAG, "doWork(): finished");
        return Result.success();
    }


    /**
     * method to set the sound setting as requested and found
     * @param setting SND, SLT, VBR
     */
    private void setSetting(String setting) {

        Logger.logD(TAG, "setSetting(): setting is " + setting);

        AudioManager am = (AudioManager) mContext.getSystemService(mContext.AUDIO_SERVICE);
        switch(setting) {
            case "SLT":
                am.setRingerMode(AudioManager.RINGER_MODE_SILENT);
                am.adjustVolume(AudioManager.ADJUST_MUTE, AudioManager.FLAG_SHOW_UI);
            case "VBR":
                am.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
                am.adjustVolume(AudioManager.ADJUST_MUTE, AudioManager.FLAG_SHOW_UI);
                //TODO: perhaps let user decide the volume
            case "SND":
                am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                am.adjustVolume(AudioManager.ADJUST_UNMUTE, AudioManager.FLAG_SHOW_UI);
        }
    }
}

我已在清单中添加了所需的权限:

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

但是,我仍然遇到异常:

 Caused by: java.lang.SecurityException: Not allowed to change Do Not Disturb state

我不确定问题出在哪里。有人可以帮我吗?

标签: androidandroid-workmanagerandroid-audiomanagerandroid-securityexception

解决方案


推荐阅读