Manage External Storage Permission | Android Studio | Java
Manage External Storage Permission
Previously (before Android 11) we only need to request the WRITE_EXTERNAL_STORAGE Permission to perform the storage-related tasks. But, now for Android 11 and above we have to request the MANAGE_EXTERNAL_STORAGE Permission to perform the storage-related tasks. Keep in mind that if you're 100% sure that your app requires this permission to work properly then request this permission otherwise Google will not allow you to publish/update your app. For example, if your app is WhatsApp Status Saver then you won't be allowed to use this permission as your app works with images and videos, not files.
After permission is granted, I'll input a name and create a folder with that name just for example. You can do whatever you want instead.
Video Tutorial:
Coding:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.technifysoft.manageexternalstoragejava"> <!--Permissions for the Android below 11 (R)--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!--Permission for the Android 11 (R) and above--> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/> <!--Android 10 only requires android:requestLegacyExternalStorage="true"--> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:requestLegacyExternalStorage="true" android:theme="@style/Theme.ManageExternalStorageJava"> <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>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="20dp" tools:context=".MainActivity"> <!--EditText: Input Folder Name--> <EditText android:id="@+id/folderNameEt" android:layout_width="match_parent" android:layout_marginTop="10dp" android:layout_height="wrap_content" android:hint="Folder Name..."/> <!--Button: Create folder--> <com.google.android.material.button.MaterialButton android:id="@+id/createFolderBtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="Create Folder"/> </LinearLayout>
MainActivity.java
package com.technifysoft.manageexternalstoragejava; import androidx.activity.result.ActivityResult; import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; 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.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.provider.Settings; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.Toast; import com.google.android.material.button.MaterialButton; import java.io.File; public class MainActivity extends AppCompatActivity { //PERMISSION request constant, assign any value private static final int STORAGE_PERMISSION_CODE = 100; private static final String TAG = "PERMISSION_TAG"; //UI Views private EditText folderNameEt; private MaterialButton createFolderBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //init UI Views folderNameEt = findViewById(R.id.folderNameEt); createFolderBtn = findViewById(R.id.createFolderBtn); //handle click, create folder createFolderBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (checkPermission()) { Log.d(TAG, "onClick: Permissions already granted..."); createFolder(); } else { Log.d(TAG, "onClick: Permissions was not granted, request..."); requestPermission(); } } }); } private void createFolder(){ //get folder name String folderName = folderNameEt.getText().toString().trim(); //create folder using name we just input File file = new File(Environment.getExternalStorageDirectory() + "/" + folderName); //create folder boolean folderCreated = file.mkdir(); //show if folder created or not if (folderCreated) { Toast.makeText(this, "Folder Created....\n" + file.getAbsolutePath(), Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Folder not created...", Toast.LENGTH_SHORT).show(); } } private void requestPermission(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){ //Android is 11(R) or above try { Log.d(TAG, "requestPermission: try"); Intent intent = new Intent(); intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); Uri uri = Uri.fromParts("package", this.getPackageName(), null); intent.setData(uri); storageActivityResultLauncher.launch(intent); } catch (Exception e){ Log.e(TAG, "requestPermission: catch", e); Intent intent = new Intent(); intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION); storageActivityResultLauncher.launch(intent); } } else { //Android is below 11(R) ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE ); } } private ActivityResultLauncher<Intent> storageActivityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { Log.d(TAG, "onActivityResult: "); //here we will handle the result of our intent if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){ //Android is 11(R) or above if (Environment.isExternalStorageManager()){ //Manage External Storage Permission is granted Log.d(TAG, "onActivityResult: Manage External Storage Permission is granted"); createFolder(); } else{ //Manage External Storage Permission is denied Log.d(TAG, "onActivityResult: Manage External Storage Permission is denied"); Toast.makeText(MainActivity.this, "Manage External Storage Permission is denied", Toast.LENGTH_SHORT).show(); } } else { //Android is below 11(R) } } } ); public boolean checkPermission(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){ //Android is 11(R) or above return Environment.isExternalStorageManager(); } else{ //Android is below 11(R) int write = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); int read = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE); return write == PackageManager.PERMISSION_GRANTED && read == PackageManager.PERMISSION_GRANTED; } } /*Handle permission request results*/ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == STORAGE_PERMISSION_CODE){ if (grantResults.length > 0){ //check each permission if granted or not boolean write = grantResults[0] == PackageManager.PERMISSION_GRANTED; boolean read = grantResults[1] == PackageManager.PERMISSION_GRANTED; if (write && read){ //External Storage permissions granted Log.d(TAG, "onRequestPermissionsResult: External Storage permissions granted"); createFolder(); } else{ //External Storage permission denied Log.d(TAG, "onRequestPermissionsResult: External Storage permission denied"); Toast.makeText(this, "External Storage permission denied", Toast.LENGTH_SHORT).show(); } } } } }
Comments
Post a Comment