Android 13 不请求 POST_NOTIFICATIONS 权限

isi*_*_ko 18 permissions notifications android android-13

我的应用程序想要发送通知,但Android 33中添加的新权限默认被拒绝,不知何故Android在尝试创建通知通道时不会自动提示用户。我有什么遗漏的吗?如果没有,我如何(以及何时)请求许可?

Bab*_*ale 11

在 sdk 33 中尝试请求权限

package com.pk.name;

import android.Manifest;
import android.app.ProgressDialog;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    final int PERMISSION_REQUEST_CODE =112;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (Build.VERSION.SDK_INT > 32) {
            if (!shouldShowRequestPermissionRationale("112")){
                getNotificationPermission();
            }
        }
    }

    public void getNotificationPermission(){
        try {
            if (Build.VERSION.SDK_INT > 32) {
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.POST_NOTIFICATIONS},
                        PERMISSION_REQUEST_CODE);
            }
        }catch (Exception e){

        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 &&
                        grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // allow

                }  else {
                    //deny
                }
                return;

        }

    }
}
Run Code Online (Sandbox Code Playgroud)


ser*_*rov 10

通知权限弹出窗口不会自动显示。您必须使用标准方式手动请求此权限并处理结果。

此外,Google 还推荐了这些最佳实践以及何时以及如何进行。


Val*_*l0n 6

这也取决于targetSdk使用情况。请参阅下面的android notification-permission 文档。至少对于新安装的应用程序来说是这样。

权限对话框出现的时间取决于您应用程序的目标 SDK 版本:

如果您的应用面向 Android 13 或更高版本,则您的应用可以完全控制何时显示权限对话框。利用这个机会向用户解释为什么应用程序需要此权限,鼓励他们授予该权限。

如果您的应用程序的目标版本为 12L(API 级别 32)或更低,则当您的应用程序在创建通知通道后首次启动 Activity 时,或者当您的应用程序启动 Activity 然后创建其第一个通知通道时,系统会显示权限对话框。这通常是在应用程序启动时发生的。


小智 5

在清单文件中声明通知权限:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
Run Code Online (Sandbox Code Playgroud)

检查权限:

@RequiresApi(Build.VERSION_CODES.TIRAMISU)
fun checkNotificationPermission() {
    val permission = Manifest.permission.POST_NOTIFICATIONS
    when {
        ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED -> {
            // make your action here
        }
        shouldShowRequestPermissionRationale(permission) -> {
            showPermissionRationaleDialog() // permission denied permanently
        }
        else -> {
            requestNotificationPermission.launch(permission)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请求许可:

private val requestNotificationPermission =
    registerForActivityResult(ActivityResultContracts.RequestPermission()) {isGranted->
        if (isGranted) // make your action here
        else "Permission denied".makeToast()
    }
Run Code Online (Sandbox Code Playgroud)