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