androidandroid-studio-3.0

How to get storage access on Android (Android 13)?


I have an issue when running my application; it should display an alert/option at the beginning to request permission to access storage, but when I run it, it doesn't appear.

my 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);
    }
}

my 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>

I want, when I run the application for the first time, a permission request to access storage to appear.


Solution

  • Does your app target Android 13 (targetSdkVersion 33)?

    If so, you need to use the new READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, and READ_MEDIA_AUDIO permissions.

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