如何在 Android (Android 13) 上获取存储访问权限?

问题描述 投票:0回答:1

我在运行应用程序时遇到问题;它应该在开始时显示一个警报/选项,以请求访问存储的权限,但是当我运行它时,它不会出现。

我的MainApp.java:



package com.example.thesymphony;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.pm.PackageManager;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.MediaStore;
import android.widget.ArrayAdapter;
import android.widget.ListView;



import java.io.File;
import java.util.ArrayList;

import android.Manifest;
import android.widget.TextView;
import android.widget.Toast;

public class MainApp extends AppCompatActivity {
    RecyclerView recyclerView;
    TextView textView;
    String[] items;
    ArrayList<AudioModel> songsList=new ArrayList<>();

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_app);
        recyclerView=findViewById(R.id.recylerView);
        textView=findViewById(R.id.warning);
        if (checkPermission()==false) {
            requestPermission();
            return;
        }
        String[] projection = {MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.DURATION};
        String selection=MediaStore.Audio.Media.IS_MUSIC + "!=0";

        Cursor cursor=getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selection, null, null);

        while (cursor.moveToNext()){
            AudioModel songData=new AudioModel(cursor.getString(1),cursor.getString(0),cursor.getString(2));
            if (new File(songData.getPath()).exists()){
            songsList.add(songData);}
            if (songsList.size()==0){
                textView.setVisibility(TextView.VISIBLE);
            }else{
                recyclerView.setLayoutManager(new LinearLayoutManager(this));
                recyclerView.setAdapter(new MusicListAdapter(songsList,getApplicationContext()));
            }
        }
    }

    boolean checkPermission() {
        int result = ContextCompat.checkSelfPermission(MainApp.this, Manifest.permission.READ_EXTERNAL_STORAGE);
        if (result == PackageManager.PERMISSION_GRANTED) {
            return true;
        } else {
            return false;
        }
    }
    void requestPermission() {
        if (ActivityCompat.shouldShowRequestPermissionRationale(MainApp.this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
            Toast.makeText(MainApp.this, "Write External Storage permission. Please allow this permission in App Settings.", Toast.LENGTH_LONG).show();
        }
        ActivityCompat.requestPermissions(MainApp.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 123);
    }
}

我的 AndroidManifest.xml:



<?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.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:roundIcon="@mipmap/ic_launcher_round"        android:supportsRtl="true"        android:theme="@style/Theme.TheSymphony"        tools:targetApi="31">        <activity            android:name=".MainApp"            android:exported="true"            android:label="@string/title_activity_main_app"            android:theme="@style/Theme.TheSymphony" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity            android:name=".MainActivity"            android:exported="true">        </activity>    </application></manifest>

我希望,当我第一次运行应用程序时,出现访问存储的权限请求。

android android-studio-3.0
1个回答
0
投票

您的应用是否面向 Android 13(targetSdkVersion 33)?

如果是这样,您需要使用新的

READ_MEDIA_IMAGES
READ_MEDIA_VIDEO
READ_MEDIA_AUDIO
权限。

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

© www.soinside.com 2019 - 2024. All rights reserved.