标签: runtime-permissions

Android 13 - 如何请求 WRITE_EXTERNAL_STORAGE

我的 Android 应用程序的目标版本是 Android 13 (API 33)

WRITE_EXTERNAL_STORAGE 权限似乎在 API 33(即 Android 12 及以下版本)下运行良好,但在 Android 13 上运行应用程序时,不会出现 WRITE_EXTERNAL_STORAGE 的运行时权限弹出窗口。

我的 Android 应用程序在应用程序的私有存储中创建一个密钥库文件。

Android 13 的行为更改提到了这一点:

如果您的应用以 Android 13 为目标平台,则必须请求一项或多项新权限,而不是 READ_EXTERNAL_STORAGE。

新的权限是:

  • 图片和照片:READ_MEDIA_IMAGES
  • 视频:READ_MEDIA_VIDEO 音频
  • 音频文件:READ_MEDIA_AUDIO

我在官方文档中没有找到任何关于此的信息。该文档仅关注媒体文件,没有提及其他文件类型。

https://developer.android.com/about/versions/13/behavior-changes-13#capsular-media-permissions

android android-manifest android-permissions runtime-permissions android-13

80
推荐指数
1
解决办法
11万
查看次数

如何在Android M中检查单个请求的多个权限?

我想用

  1. android.permission.CAMERA
  2. android.permission.WRITE_EXTERNAL_STORAGE

在单个请求中使用

ActivityCompat.requestPermissions(Activity activity,new String permisionList[],int permissionRequestcode);
Run Code Online (Sandbox Code Playgroud)

但我的问题是,我只是请求一个权限,我读了关于组权限,但它只适用于由开发人员,喜欢CONTACT_GROUP : read_contact,write_contact等决定的相同组.

我想创建自定义组权限,只向我询问一个请求并仅向我提供一个响应.

谢谢

android android-6.0-marshmallow runtime-permissions

58
推荐指数
4
解决办法
9万
查看次数

Android Studio - 删除安全异常警告

我正在通过用户的位置

Location location = LocationServices.FusedLocationApi.getLastLocation(
            mGoogleApiClient);
Run Code Online (Sandbox Code Playgroud)

这行代码在方法内部,在调用此方法之前,我会检查Android运行时权限.只有当用户可以获得权限时,我才会调用此方法.代码工作得很好.

问题是Android Studio仍然在此行上显示错误,而不是在调用此函数之前已经检查过我已经检查过.

Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with `checkPermission`) or explicitly handle a potential `SecurityException`
Run Code Online (Sandbox Code Playgroud)

现在我该如何删除此警告?我已经检查了权限,并且不想再次检查只是为了删除此警告.我已经尝试添加@SuppressWarnings(),但不知道要传递给它的确切字符串. @SuppressWarnings({"all"})有效,但显然不推荐.

如何删除此警告?

编辑1:这是我的确切代码 -

private void checkPermissions() {
    if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED)
        getLocation();  //Method called if I have permission
}

private void getLocation() {
    //Android studio shows warning at this line.
    Location location = LocationServices.FusedLocationApi.getLastLocation(
            mGoogleApiClient);
}
Run Code Online (Sandbox Code Playgroud)

但是如果我将权限检查放在getLocation()方法中,那么警告就会消失.@SuppressWarnings({"MissingPermission"})无效. …

android suppress-warnings android-studio runtime-permissions

53
推荐指数
2
解决办法
2万
查看次数

发布错误即将检查权限声明表单中的错误(播放存储错误)

它显示此错误 在此输入图像描述

这是我的权限

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
Run Code Online (Sandbox Code Playgroud)

我做了动态许可的事情.不过,我收到了这个错误.

java android runtime-permissions google-play-console

28
推荐指数
1
解决办法
1637
查看次数

Android API 33 权限未授予

因此,当我在developer.android 站点中读到时,它Android 13在“权限”字段中带来了新的更改。

我有一个聊天应用程序,我需要拨打电话、打开相机、录制音频、在外部存储中读取和写入。因此,在 SplashScreen 中,我向用户请求这些权限。然而,其中一些没有被授予,但甚至系统也没有向我索要这些。

AndroidManifest.xml这是我在文件中声明的内容

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

    <uses-feature
        android:name="android.hardware.camera"
        android:required="true" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-feature
        android:glEsVersion="0x00020000" …
Run Code Online (Sandbox Code Playgroud)

android runtime-permissions android-tiramisu android-13

22
推荐指数
2
解决办法
6万
查看次数

如何调试/重置Android 6.0权限?

在迁移我的某个应用程序以使用Android 6.0权限系统时,我发现使用模拟器调试权限非常困难.

发现:

  • 在使用该requestPermissions()方法时,禁用应用信息屏幕中的权限不会重新显示授予权限对话框.
  • 重新安装应用程序似乎是让应用程序再次显示授予权限对话框的唯一方法.

使用Android模拟器调试权限的正确方法是什么?

android android-permissions android-debug android-6.0-marshmallow runtime-permissions

17
推荐指数
1
解决办法
9202
查看次数

onRequestPermissionsResult 在片段中不起作用

我正在尝试实现 Marshmallow 的权限支持,但我在“onRequestPermissionsResult”中的代码从未被调用。

在 Activity 中工作时,它的工作正常但在片段中我遇到了问题,即控件没有进入 onRequestPermissionsResult()

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                            mCheckPermission();
                        }
Run Code Online (Sandbox Code Playgroud)

在 mCheckPermission() 中:-

public void mCheckPermission() {
        if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getActivity(),
                Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
                    PERMISSION_REQUEST_COARSE_LOCATION );

        }
    }
Run Code Online (Sandbox Code Playgroud)

对话框弹出 2 个按钮。拒绝和允许。单击按钮时,控件未进入 onRequestPermissionCheck();

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

        switch (requestCode){
            case PERMISSION_REQUEST_COARSE_LOCATION: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    Toast.makeText(getActivity(), "permission granted", Toast.LENGTH_LONG).show();
                    //call your action

                } …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-runtime runtime-permissions

14
推荐指数
1
解决办法
6583
查看次数

Android Marshmallow 6.0在运行时请求权限

我正在测试我的应用程序Marshmallow 6.0,它正在关闭android.permission.READ_EXTERNAL_STORAGE,即使已经在Manifest中定义了它.在某处我读过,如果我在运行时请求权限,那么它就不会强行关闭你的应用程序.我也读过这个android文档,用于请求运行时权限.

所以,我开始知道我们可以请求android文档中提到的下面的权限.

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS); …
Run Code Online (Sandbox Code Playgroud)

java android android-6.0-marshmallow runtime-permissions

13
推荐指数
2
解决办法
1万
查看次数

如何从Android版本的Marshmallow开始请求允许从Android拨打电话?

我正在尝试从Android拨打电话,我也设置了运行时权限.它询问是否允许拨打电话.但是当我按下允许时,应用程序崩溃了:

这是我实现它的方式:

private static final int REQUEST_PHONE_CALL = 1;
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "+918511812660"));

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
    }
    else
    {
        startActivity(intent);
    }
}
else
{
    startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)


@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case REQUEST_PHONE_CALL: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                startActivity(intent);
            }
            else
            {

            }
            return;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我在logcat中获得的:

java.lang.RuntimeException: Failure delivering result …
Run Code Online (Sandbox Code Playgroud)

java android phone-call runtime-permissions

13
推荐指数
3
解决办法
4万
查看次数

如何避免为请求权限编写重复的样板代码?

我正在更新我的应用程序以兼容Android 6.权限模型在理论上并不复杂,但现在我正在实现它,我发现自己在每个需要权限的活动中编写了相同的丑陋样板代码.

对于我需要的每一个许可,都有一个

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.PERMISSION) !=
                PackageManager.PERMISSION_GRANTED) {
} else {
}
Run Code Online (Sandbox Code Playgroud)

然后在onRequestPermissionsResult我必须检查/过滤每个请求的结果并将其转换为我的活动理解的内容.

我现在正在更新我的第二个活动,并且权限代码与第一个类似,它几乎看起来像是复制粘贴的.线条很长,代码很相似,看起来很丑陋.

我不想使用第三方解决方案,我尝试了一些,但我更愿意完全控制代码.例如,某些库不支持我在项目中使用的Java 8.

我可以做些什么来避免在我的所有活动中出现一堆重复的代码?

android android-permissions android-6.0-marshmallow runtime-permissions

9
推荐指数
1
解决办法
907
查看次数