我在React Native中遇到了与Android 11相关的问题。在我的应用程序中,我从/storage/emulated/0/WhatsApp/Media/获取WhatsApp状态。在Android10之前,状态/文件夹所有东西都可以找到,但在Android11中,它什么也没有显示。请帮我做这件事。
这是我的反应原生代码读取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([]);
})
我修复了这个问题,并指导你如何从应用程序中的什么应用程序中获得状态,因为大多数人都在Android10和11中遇到问题,以便在2021年6月9日更新什么应用程序后获得状态
请记住,在更新之前,您从路径获得的状态是不同的,现在它更新到不同的路径,请参阅下面的变化,
首先保持这两个路径,当你将得到的状态只是检查哪些应用程序版本安装在设备上如果旧的然后它将从旧的路径如果什么应用程序更新在用户设备上然后它将从新的路径
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);
}
在你的主文件中做这些更改
<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;
}
现在我指的是我所遵循的实际代码链接,如果您需要进一步的帮助,请在评论中回复我。
当你转到下面的链接时,你必须转到utils common类,然后看看它是如何复制文件的实现的,并尝试在你的应用程序代码中调整它
参考链路
请提出一个条件
// Old Version path
String targetPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/WhatsApp/Media/.Statuses";
Android11路径
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();
}
在Android 11设备上,你的应用程序可以访问你提到的文件夹,但不会看到属于其他应用程序的文件。只有子文件夹。
因此,文件的所有者在Android 11设备上很重要。
对于在家测试,您可以使用MANAGE_EXTERNAL_STORAGE请求访问所有文件。
请参阅:在Android API 29中访问外部存储
我试图在用户登录后显示我的json响应。当用户输入正确的信息时,它成功地在我的应用程序中显示响应。但是当用户在这里输入错误的凭证时,应用程序会崩溃,这是当用户输入错误信息时我的json响应。它应该显示状态=0在我的应用程序显示(或任何我想显示的响应 这是当用户按下登录按钮时我的API调用 } 我的模型类 然后在这里,我显示我的响应,当用户输入正确的凭据时,该响应成功执行。但是在输入错误的凭据时崩溃
我已经为servlet编写了这段代码 我已经编译了它,它对应的html文件action属性值是 web.xml包含 servlet name four servlet类Httpservlet1 servlet-name 4 url-模式 /HTTPSERVLET在xml代码格式下运行时仍然显示错误信息
我正在尝试创建一个非常简单的应用程序,当点击中心小部件时,列表中的元素会显示出来。 这是我的代码: 没有显示任何错误,但同时,我的目标没有达到,因为没有显示任何文本,即使我添加了这个代码打印(yourList[randomIndex]),也不会在终端中打印任何内容;。我如何显示文本,并使打印出现?
你好我有个问题。 我们两天前已将我们的应用程序发布到您的应用程序库中。 我无法通过手机在华为应用程序库上看到我的应用程序,但当我进入华为应用程序库网站时,我可以看到我的应用程序。 另外,一些包含google play和华为应用程序库的手机可以在华为应用程序库上显示该应用程序(通常是旧手机) 我的手机是华为y6p 我的应用程序库版本是11.1。1.304 我所在的地区是土耳其(我们的应用程序支持土耳
我正在开发什么样的应用程序状态保护程序,我不明白如何才能让它在Android11上工作。由于存储所有存储访问受到限制,谷歌拒绝了我的更新,因为使用了所有文件访问(管理外部存储)权限。 但我测试了另一个应用程序,它运行良好,甚至可以在根目录下保存文件。此应用请求此权限允许访问照片、媒体和文件,当我在应用设置中检查权限时,它表示应用可以访问所有文件的管理。即使应用程序具有“所有文件”权限,也不会显示此
我正在使用Twilio WhatsApp API。我有沙盒账户,我可以从Twilio向WhatsApp号码发送消息,但是,我面临一个问题,当消息不发送给收件人时,我从API获得的状态与我获得的成功相同。 如果需要,这里是我的代码。