m0_70709784 2024-03-03 11:44 采纳率: 0%
浏览 115
已结题

android开发打不开相册,不弹出授权信息,请问怎么解决?

我的代码是这样的。

//选择图片的授权
public void choosePhoto(View view) {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
//打开相册的openAlbum方法
        openAlbum(); 
    } else {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
    }
}

然后就是打开相册的方法

    private void openAlbum() {
        Intent intent = new Intent("android.intent.action.GET_CONTENT");
        intent.setType("image/*");
        startActivityForResult(intent, REQUEST_CODE_CHOOSE);
    }

授权回调,然而我在这里用deBug测试了grantResults[0]的值为-1,就直接进入else代码中了,并没有弹出授权的提示框

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode==0){
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                openAlbum();
            } else {
                Toast.makeText(this, "你没有获得访问相册权限~", Toast.LENGTH_SHORT).show();
            }
        }
    }

这里是在manifests中写的权限申请

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

最后的结果是我点击了相册弹出的提示,“你没有获得访问相册的权限”,如下图所示:

img

全部的代码如下:

package com.example.myapplication;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_CODE_CHOOSE = 0;

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

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode==0){
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                openAlbum();
            } else {
                Toast.makeText(this, "你没有获得访问相册权限~", Toast.LENGTH_SHORT).show();
            }
        }
    }

    public void choosePhoto(View view) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            // 真正的去打开相册
            openAlbum();
        } else {
            // 去申请权限
            // 这里没有弹出授权信息,不起作用
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
        }
    }

    private void openAlbum() {
        Intent intent = new Intent("android.intent.action.GET_CONTENT");
        intent.setType("image/*");
        startActivityForResult(intent, REQUEST_CODE_CHOOSE);
    }
}

请各位赐教,要怎么样才能用提示授权的方式打开相册呢?本人一枚,等答案中

另外追加一个Manifest的清单代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

  • 写回答

33条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-03 11:46
    关注
    获得2.00元问题酬金

    引自免费微信小程序:皆我百晓生

    在您的代码中,您已经正确地处理了权限检查和请求。不过,当用户拒绝授权且未勾选“不再提示”时,系统应当会弹出权限请求对话框。根据您的描述,用户可能已经在之前的请求中选择了“不再提示”,导致即使调用ActivityCompat.requestPermissions()也不会再次显示授权提示。

    要解决这个问题,您需要检查应用的权限状态,并指导用户如何在设置中手动开启权限:

    // 检查是否已经永久拒绝该权限
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            // 用户之前拒绝了权限,但没有勾选“不再提示”
            // 这里可以显示一个对话框解释为什么需要这个权限,然后重新发起请求
            new AlertDialog.Builder(this)
                .setTitle("权限申请")
                .setMessage("为了能正常使用相册功能,请允许我们访问您的存储权限。")
                .setPositiveButton("去设置", (dialog, which) -> {
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    Uri uri = Uri.fromParts("package", getPackageName(), null);
                    intent.setData(uri);
                    startActivityForResult(intent, REQUEST_PERMISSION_SETTING);  // 自定义请求码
                })
                .setNegativeButton("取消", null)
                .show();
        } else {
            // 如果用户已永久拒绝,则直接引导至应用详情页面以更改权限设置
            goToAppSettings();
        }
    } else {
        // SDK版本低于M(23),无需动态权限请求,直接打开相册
        openAlbum();
    }
    
    // 引导用户到应用详情页面更改权限设置的方法
    private void goToAppSettings() {
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", getPackageName(), null);
        intent.setData(uri);
        startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_PERMISSION_SETTING) {
            // 当用户从设置界面返回后,应再次检查权限状态并相应地进行操作
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "权限已获取,现在可以打开相册了", Toast.LENGTH_SHORT).show();
                openAlbum();
            }
        }
    }
    

    请注意,REQUEST_PERMISSION_SETTING是一个自定义请求码,用于标识用户是从应用详情页返回的结果。这样,在onActivityResult()方法中就可以针对用户修改权限后的结果做出反应。

    此外,确保您的应用在AndroidManifest.xml中的目标SDK版本不低于23,因为从Android 6.0(API级别23)开始引入了运行时权限机制。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月11日
  • 赞助了问题酬金50元 3月3日
  • 赞助了问题酬金20元 3月3日
  • 修改了问题 3月3日
  • 展开全部