'WhatsApp Status Save In Android 11 or above

Please guide me how to access whatsapp status folder in android 11? I have seen status saver apps in play store that doesn't ask for any special permission but are still able to show statuses? Tell me how can I access WhatsApp/Media/.Statuses folder in android 11?



Solution 1:[1]

You can solve it using the DocumentTreeIntent if you make it allow permission for the WhatsApp folder explicitly for android 11 here is how you can do that.

     if (Constants.isPackageInstalled(getActivity(), "com.whatsapp")) {


        Intent intent;
        StorageManager sm = (StorageManager) getActivity().getSystemService(STORAGE_SERVICE);
        String statusDir = getWhatsupFolder();
        String str = "android.provider.extra.INITIAL_URI";
        if (Build.VERSION.SDK_INT >= 29) {
            intent = sm.getPrimaryStorageVolume().createOpenDocumentTreeIntent();
            String scheme = ((Uri) intent.getParcelableExtra(str)).toString().replace("/root/", "/document/");
            String stringBuilder = scheme +
                    "%3A" +
                    statusDir;
            intent.putExtra(str, Uri.parse(stringBuilder));

        } else {
            intent = new Intent("android.intent.action.OPEN_DOCUMENT_TREE");
            intent.putExtra(str, Uri.parse(statusDir));
        }
        intent.addFlags(2);
        intent.addFlags(1);
        intent.addFlags(128);
        intent.addFlags(64);
        startActivityForResult(intent, REQUEST_ACTION_OPEN_DOCUMENT_TREE);
        return;
    }

before using this code you must check if WhatsApp is installed or not so the first check is for that here is the code for that.

 try {

        context.getPackageManager().getPackageInfo(packageName, 0);
    } catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
       
     }

after granting permission you must retrieve files via this code

 private DocumentFile[] getFromSdcard() {
    DocumentFile fromTreeUri = DocumentFile.fromTreeUri(requireContext().getApplicationContext(), Uri.parse(namedataprefs));
    if (fromTreeUri != null && fromTreeUri.exists() && fromTreeUri.isDirectory() && fromTreeUri.canRead() && fromTreeUri.canWrite()) {
        return fromTreeUri.listFiles();
    }
    return null;
}

DocumentFile[] allFiles = getFromSdcard();
//to get signal file path
String path = allFiles[0].getUri().toString();

you can get further details about document tree intent from the below code its just for understanding purposes

Ref : How to check which StorageVolume we have access to, and which we don't?

    requestAccessButton.setOnClickListener {
        storageVolumes = storageManager.storageVolumes
        val primaryVolume = storageManager.primaryStorageVolume
        val intent = primaryVolume.createOpenDocumentTreeIntent()
        startActivityForResult(intent, 1)
    }
}

private fun checkAccessToStorageVolumes() {
    val storageVolumePathsWeHaveAccessTo = HashSet<String>()
    val persistedUriPermissions = contentResolver.persistedUriPermissions
    persistedUriPermissions.forEach {
        storageVolumePathsWeHaveAccessTo.add(it.uri.toString())
    }
    val storageManager = getSystemService(Context.STORAGE_SERVICE) as StorageManager
    val storageVolumes = storageManager.storageVolumes

    for (storageVolume in storageVolumes) {
        val uuid = if (storageVolume.isPrimary) {
            // Primary storage doesn't get a UUID here.
            "primary"
        } else {
            storageVolume.uuid
        }
        val volumeUri = uuid?.let { buildVolumeUriFromUuid(it) }
        when {
            uuid == null -> 
                Log.d("AppLog", "UUID is null for ${storageVolume.getDescription(this)}!")
            storageVolumePathsWeHaveAccessTo.contains(volumeUri) -> 
                Log.d("AppLog", "Have access to $uuid")
            else -> Log.d("AppLog", "Don't have access to $uuid")
        }
    }
}

private fun buildVolumeUriFromUuid(uuid: String): String {
    return DocumentsContract.buildTreeDocumentUri(
        "com.android.externalstorage.documents",
        "$uuid:"
    ).toString()
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    Log.d("AppLog", "resultCode:$resultCode")
    val uri = data?.data ?: return
    val takeFlags =
        Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
    contentResolver.takePersistableUriPermission(uri, takeFlags)
    Log.d("AppLog", "granted uri: ${uri.path}")
}

Solution 2:[2]

For Fetch Whatsapp Status in Android 11 You have to Fetch this status from this path. which is written below:-

Android->media->com.whatsapp->WhatsApp->Media->.Statues->"You can see all statues which was show by user"

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Aneeq Shah
Solution 2 LIMBANI jay