在Android 11或更高版本中保存WhatsApp状态 [英] WhatsApp Status Save In Android 11 or above

查看:0
本文介绍了在Android 11或更高版本中保存WhatsApp状态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请指导我如何访问Android 11中的WhatsApp Status文件夹? 我在Play商店中看到过状态保护应用程序,它们不需要任何特殊许可,但仍然可以显示状态? 告诉我如何访问Android 11中的WhatsApp/Media/.Status文件夹?

推荐答案

如果您将DocumentTreeIntent设置为显式允许对Android 11的WhatsApp文件夹的权限,则可以使用DocumentTreeIntent解决此问题。以下是您可以执行此操作的方法。

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

在使用此代码之前,您必须检查是否安装了WhatsApp,因此第一个检查是检查,这是该代码。

 try {

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

授予权限后,您必须通过此代码检索文件

 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();

您可以从下面的代码中获取有关文档树意图的更多详细信息,这只是为了便于理解

引用: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}")
}

这篇关于在Android 11或更高版本中保存WhatsApp状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆