Android 11 未在应用程序中显示 WhatsApp 状态。 /storage/emulated/0/WhatsApp/Media/.Statuses/ 文件夹显示空结果
Android 11 not showing WhatsApp status in app. /storage/emulated/0/WhatsApp/Media/.Statuses/ folder shows empty result
我在 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([]);
})
在 Android 11 设备上,您的应用程序可以访问您提到的文件夹,但它不会看到属于其他应用程序的文件。只有子文件夹。
所以文件的所有者在 Android 11 设备上很重要。
对于在家进行测试,您可以使用 MANAGE_EXTERNAL_STORAGE 请求所有文件访问权限。
参见:
请提出一个条件
// Old Version path
String targetPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/WhatsApp/Media/.Statuses";
Android 11 路径
targetPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/media/com.whatsapp/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();
}
我解决了这个问题,并指导您如何从您的应用程序中的 whats 应用程序获取状态,因为大多数人在 android 10 和 11 中遇到问题以获取 whats 之后的状态应用更新于 09/06/2021
请记住,在更新之前,您从路径获取的状态是不同的,现在它更新到不同的路径,请参阅下面的更改,
首先保留这两个路径,当您获得状态时,只需检查设备上安装了哪个 whats app 版本,如果是旧的,那么它将从旧路径获取,如果 whats app 在用户设备上更新,那么它将获得从新路径
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">
将您的设备编译 sdk 版本和目标设置为 api 29 然后您的应用程序将 运行 在 android 10 和 11 api.
**还有一件事你必须以这种方式使用权限**
public class PermissionActivity extends AppCompatActivity {
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;
}
现在请您参考实际代码 link,如果您需要进一步的帮助,请在评论中回复我。
当你要转到下面时 link 你必须转到通用工具 class 然后看看它如何复制文件的实现尝试调整它您的应用代码
我在 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([]);
})
在 Android 11 设备上,您的应用程序可以访问您提到的文件夹,但它不会看到属于其他应用程序的文件。只有子文件夹。
所以文件的所有者在 Android 11 设备上很重要。
对于在家进行测试,您可以使用 MANAGE_EXTERNAL_STORAGE 请求所有文件访问权限。
参见:
请提出一个条件
// Old Version path
String targetPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/WhatsApp/Media/.Statuses";
Android 11 路径
targetPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/media/com.whatsapp/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();
}
我解决了这个问题,并指导您如何从您的应用程序中的 whats 应用程序获取状态,因为大多数人在 android 10 和 11 中遇到问题以获取 whats 之后的状态应用更新于 09/06/2021
请记住,在更新之前,您从路径获取的状态是不同的,现在它更新到不同的路径,请参阅下面的更改,
首先保留这两个路径,当您获得状态时,只需检查设备上安装了哪个 whats app 版本,如果是旧的,那么它将从旧路径获取,如果 whats app 在用户设备上更新,那么它将获得从新路径
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">
将您的设备编译 sdk 版本和目标设置为 api 29 然后您的应用程序将 运行 在 android 10 和 11 api.
**还有一件事你必须以这种方式使用权限**
public class PermissionActivity extends AppCompatActivity {
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;
}
现在请您参考实际代码 link,如果您需要进一步的帮助,请在评论中回复我。
当你要转到下面时 link 你必须转到通用工具 class 然后看看它如何复制文件的实现尝试调整它您的应用代码