Android 11未在应用程序中显示WhatsApp状态/存储/模拟/0/WhatsApp/Media/.status/文件夹显示空结果

Android 11未在应用程序中显示WhatsApp状态/存储/模拟/0/WhatsApp/Media/.status/文件夹显示空结果,android,react-native,whatsapp,status,android-11,Android,React Native,Whatsapp,Status,Android 11,我在React Native中遇到了与Android 11相关的问题。在我的应用程序中,我从/storage/emulated/0/WhatsApp/Media/.Statuses/文件夹中获取WhatsApp状态,直到Android 10都可以找到,但在Android 11中它什么也没有显示。请帮我做这件事 这是我读取WhatsApp状态文件夹的本机代码 var RNFS = require('react-native-fs'); RNFS.readDir(RNFS.Ext

我在React Native中遇到了与Android 11相关的问题。在我的应用程序中,我从/storage/emulated/0/WhatsApp/Media/.Statuses/文件夹中获取WhatsApp状态,直到Android 10都可以找到,但在Android 11中它什么也没有显示。请帮我做这件事

这是我读取WhatsApp状态文件夹的本机代码

  var RNFS = require('react-native-fs');
        RNFS.readDir(RNFS.ExternalStorageDirectoryPath + '/WhatsApp/Media/.Statuses/').then((result) => {
             printLogs("Result=>", result);
             result.map((item)=>{
                 printLogs("path===>",item.path)
             })
            setStatusList(result.sort((a, b) => a.mtime < b.mtime ? 1 : -1));
            setRefresh(false);

        }).catch((error) => {
            printLogs("error=>", error);
            setRefresh(false);
            setStatusList([]);

        })
var RNFS=require('react-native-fs');
RNFS.readDir(RNFS.ExternalStorageDirectoryPath+'/WhatsApp/Media/.status/')。然后((结果)=>{
打印日志(“结果=>”,结果);
结果图((项目)=>{
打印日志(“路径==>”,item.path)
})
setStatusList(result.sort((a,b)=>a.mtime{
打印日志(“错误=>”,错误);
设置刷新(假);
setStatusList([]);
})

在Android 11设备上,您的应用程序可以访问您提到的文件夹,但不会看到属于其他应用程序的文件。只有子文件夹

因此,文件的所有者在Android 11设备上很重要

对于在家测试,您可以使用MANAGE_EXTERNAL_STORAGE请求访问所有文件


请参见:

请提出一个条件

// Old Version path
String targetPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/WhatsApp/Media/.Statuses";   
        if (android.os.Build.VERSION.SDK_INT < 30) {
            // Less then 11
            String targetPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/WhatsApp/Media/.Statuses";
            File targetDirector = new File(targetPath);
            allfiles = targetDirector.listFiles();
        } else {
            // Android 11
            String targetPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/media/com.whatsapp/WhatsApp/Media/.Statuses";
            File targetDirector = new File(targetPath);
            allfiles = targetDirector.listFiles();

        }
安卓11路径

targetPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/media/com.whatsapp/WhatsApp/Media/.Statuses";
并提出一个条件

// Old Version path
String targetPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/WhatsApp/Media/.Statuses";   
        if (android.os.Build.VERSION.SDK_INT < 30) {
            // Less then 11
            String targetPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/WhatsApp/Media/.Statuses";
            File targetDirector = new File(targetPath);
            allfiles = targetDirector.listFiles();
        } else {
            // Android 11
            String targetPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/media/com.whatsapp/WhatsApp/Media/.Statuses";
            File targetDirector = new File(targetPath);
            allfiles = targetDirector.listFiles();

        }
if(android.os.Build.VERSION.SDK_INT<30){
//少于11
字符串targetPath=Environment.getExternalStorageDirectory().getAbsolutePath()+“/WhatsApp/Media/.Status”;
文件targetDirector=新文件(targetPath);
allfiles=targetDirector.listFiles();
}否则{
//安卓11
字符串targetPath=Environment.getExternalStorageDirectory().getAbsolutePath()+“/Android/media/com.whatsapp/whatsapp/media/.Status”;
文件targetDirector=新文件(targetPath);
allfiles=targetDirector.listFiles();
}

我修复了这个问题,并指导您如何从应用程序中的whats应用程序获取状态,因为大多数人在2021年6月9日whats应用程序更新后,在android 10和11中都遇到了获取状态的问题。

请记住,在更新之前,您从路径获得的状态是不同的,现在更新到不同的路径请参见下面的更改

首先保留这两个路径,当您将获得状态时,只需检查设备上安装的whats应用程序版本,如果是旧的,那么它将从旧路径获得如果whats应用程序在用户设备上更新,那么它将从新路径获得

 public static final File STATUS_DIRECTORY = new File(Environment.getExternalStorageDirectory() +
        File.separator + "WhatsApp/Media/.Statuses");

public static final File STATUS_DIRECTORY_NEW = new File(Environment.getExternalStorageDirectory() +
        File.separator + "Android/media/com.whatsapp/WhatsApp/Media/.Statuses");
现在检查用户设备中的目录

 if (Common.STATUS_DIRECTORY.exists()) {

        execute(Common.STATUS_DIRECTORY);

    } else if (Common.STATUS_DIRECTORY_NEW.exists()) {

        execute(Common.STATUS_DIRECTORY_NEW);

    } 
在mainfest文件中,执行以下更改

 <uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission
    android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
    android:minSdkVersion="30"
    tools:ignore="ScopedStorage" />
<uses-permission
    android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="29" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:requestLegacyExternalStorage="true"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
导入android.app.ActivityManager; 导入android.content.Intent; 导入android.content.pm.PackageManager; 导入android.os.Build; 导入android.os.Bundle; 导入android.os.Handler; 导入android.os.Looper

导入androidx.annotation.NonNull; 导入androidx.appcompat.app.appcompat活动; 导入androidx.core.app.ActivityCompat; 导入java.util.Objects

公共类PermissionActivity扩展了AppCompativeActivity{

private static final int REQUEST_PERMISSIONS = 1234;
private static final String[] PERMISSIONS = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};
private static final String MANAGE_EXTERNAL_STORAGE_PERMISSION = "android:manage_external_storage";

private final Handler handler = new Handler(Looper.getMainLooper());

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    if (!arePermissionDenied()){
        next();
        return;
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && arePermissionDenied()) {

        requestPermissions(PERMISSIONS, REQUEST_PERMISSIONS);
    }

}

@Override
protected void onResume() {
    super.onResume();
    if (!arePermissionDenied()) {
        next();
    }
}



@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_PERMISSIONS && grantResults.length > 0) {
        if (arePermissionDenied()) {
            // Clear Data of Application, So that it can request for permissions again
            ((ActivityManager) Objects.requireNonNull(this.getSystemService(ACTIVITY_SERVICE))).clearApplicationUserData();
            recreate();
        } else {
            next();
        }
    }
}

private void next() {

    handler.postDelayed(() -> {
        startActivity(new Intent(PermissionActivity.this, MainActivity.class));
        finish();
    }, 1000);

}

private boolean arePermissionDenied() {



    for (String permissions : PERMISSIONS) {
        if (ActivityCompat.checkSelfPermission(getApplicationContext(), permissions) != PackageManager.PERMISSION_GRANTED) {
            return true;
        }
    }
    return false;
}
现在我指的是你的实际代码链接,我遵循这样做,如果你需要进一步的帮助,请回复我在评论回来

当您转到下面的链接时,您必须转到utils common类,然后是,并查看其如何复制文件的实现尝试在应用程序代码中调整它


谢谢它对我有用。在清单中添加“android:requestLegacyExternalStorage=“true”后,它的工作不可能。这对android 11设备没有影响。只有android 10可用。如果您使用管理外部存储权限,您的更新将在Google Play中被拒绝