我可以通过 Android Studio Emulator 使用 API R。我知道我可以直接从 Android Studio 运行,但我仍然想在 Gradle 级别进行设置。
android {
compileSdkVersion 30
defaultConfig {
applicationId "com.example.test"
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
Run Code Online (Sandbox Code Playgroud) 当您ACTION_OPEN_DOCUMENT_TREE在 Android 11 中选择存储文件的路径的权限时,默认的 Android 内容管理器默认会在最近使用的路径上打开,并且由于某种原因“使用此文件夹”按钮根本不会出现,即使此路径是可访问路径,除非用户手动移动路径以转到合适的位置(或者返回默认打开的路径,如果这是可选位置,则移动到目录)。
例如,假设用户使用的最新路径是Documents。当我要求用户选择允许应用程序保存文件的路径时,
Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
i.addCategory(Intent.CATEGORY_DEFAULT);
Run Code Online (Sandbox Code Playgroud)
这就是出现的情况:
正如您所看到的,没有“使用此文件夹”蓝色按钮。
现在,如果用户从此处选择超级文件夹路径并在文档中再次输入,这就是他所看到的:
现在“使用此文件夹”按钮可用。
这是完全没有意义的,而且对用户体验来说非常糟糕,许多用户最终肯定会感到烦恼和困惑地卸载该应用程序。
难道我做错了什么?是否可以向意图传递一些提示,以便直接在所有 Android 设备存储(例如DocumentsACTION_OPEN_DOCUMENT_TREE )中可用的特定路径中打开内容管理器视图,并在打开选择器时使用“使用此文件夹”按钮?
我的操作系统是 PixysOS - Android 11 当我这样做时
mount -o rw,remount /system
Run Code Online (Sandbox Code Playgroud)
它失败了——
mount: '/system' not in /proc/mounts
Run Code Online (Sandbox Code Playgroud)
但通常它是有效的。我也在android 9中测试过
Android 11 中引入了范围存储。根据文档,应使用保存非媒体文件(如 PDF)的存储访问框架。因此,使用存储访问框架的用户需要使用系统文件选择器选择位置来保存非媒体文件(PDF)。但是如果您在 Android 11 上使用 Whatsapp 应用程序并尝试保存 PDF 文件,它永远不会要求用户选择位置。默认情况下,它将保存 pdf 文件到外部文档目录。我想在我的应用程序中复制相同的行为。有人可以在这里指导我吗?
我在清单文件中有以下配置 -
<activity
android:name=".activities.PopupWord"
android:excludeFromRecents="true"
android:theme="@style/popups">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PROCESS_TEXT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/*" />
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
我可以在 Android 10 中的 Twitter 等应用程序的文本选择菜单中看到“查找”按钮,但在 Android 11 中它消失了。令人惊讶的是它在 Chrome 中运行。
维基百科测试版以某种方式规避了这个问题,并在各处显示其“在维基百科中搜索”按钮。我试图查看它的清单,发现它很相似。
<activity
android:name="org.wikipedia.search.SearchActivity"
android:windowSoftInputMode="0x10">
<intent-filter
android:label="@ref/0x7f100190">
<action
android:name="android.intent.action.SEND" />
<category
android:name="android.intent.category.DEFAULT" />
<data
android:mimeType="text/plain" />
</intent-filter>
<intent-filter
android:label="@ref/0x7f100190">
<action
android:name="android.intent.action.PROCESS_TEXT" />
<category
android:name="android.intent.category.DEFAULT" />
<data
android:mimeType="text/plain" />
</intent-filter>
</activity> …Run Code Online (Sandbox Code Playgroud) 到目前为止,我检查文件是否存在,如果不存在,则将其保存到 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) 中的设备,但 Android 10 不支持它。
所以我尝试使用 mediastore API 来保存图像。
READ_STORAGE_PERMISSION -> 不允许
首先,我使用以下代码查询 contentresolver 以检查文件是否存在:
Uri collection = null;
collection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL);
String[] PROJECTION = new String[]{MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.MediaColumns.RELATIVE_PATH};
String QUERY = MediaStore.Files.FileColumns.RELATIVE_PATH + " like ? and " +
MediaStore.Files.FileColumns.DISPLAY_NAME + " like ?";
ContentResolver mContentResolver = this.getContentResolver();
Cursor cursor = mContentResolver.query(collection, PROJECTION, QUERY , new String[]{"%" + dirName + "%", "%" + fname + "%"}, null);
if (cursor != null) {
Log.d("upisdk", "cursor != null");
if (cursor.getCount() > …Run Code Online (Sandbox Code Playgroud) 我需要在我的应用程序中使用后台服务一定时间后删除屏幕截图图像文件,并且使用上述方法工作正常
private void deleteTheFile(String path) {
File fdelete = new File(path);
if (fdelete.exists()) {
if (fdelete.delete()) {
getApplicationContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(path))));
Log.i(TAG, "deleteTheFile: file deleted");
} else {
Log.i(TAG, "deleteTheFile: file not dellleeettteeeddd");
}
}
Run Code Online (Sandbox Code Playgroud)
但正如每个人都知道 android R (11) 带来的变化所以我尝试更新我的应用程序
MANAGE_EXTERNAL_STORAGE 权限
但谷歌拒绝了我的更新说
问题:需要使用 Media Store API
您已请求访问所有文件访问权限,但您的应用程序的核心功能似乎只需要访问媒体文件。借助 MediaStore API,应用程序可以贡献和访问外部存储卷上可用的媒体,而无需访问所有文件权限。
请更新您的应用,以便该功能使用媒体存储 API 并删除所有文件访问 (MANAGE_EXTERNAL_STORAGE) 权限。
但我以前从未使用过媒体存储API,我不知道它是否可以用它删除图像文件,因为删除文件属于可写部分
我无法将捕获的图像存储在 (getExternalFilesDir(Environment.DIRECTORY_PICTURES)) Android 11 设备中。
我
<uses-permissionandroid:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>也添加了清单和所有文件访问权限。但这不起作用。
if (Build.VERSION.SDK_INT >= 30) {
if (!Environment.isExternalStorageManager()) {
try {
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse(String.format("package:%s", applicationContext.packageName))
startActivityForResult(intent, 2296)
} catch (e: Exception) {
val intent = Intent()
intent.action = Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
startActivityForResult(intent, 2296)
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码可在 Android 11 设备下运行。但在 Android 11 上文件未创建File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) .toString() + "/" + FolderName )
在目标 SDK API 级别迁移到 30 后,Google 审核团队不断拒绝我们的应用程序。拒绝原因是您的应用因违反政策而被拒绝且未发布。策略:所有文件访问权限。
我们尚未在最新的清单中添加任何敏感权限和 API。也无法从我们最近提交的内容中找到任何请求敏感权限的 APK。
在我们之前提交的一份文件中,我们不小心提交了一份“所有文件访问”权限声明表,但遭到了 Google 拒绝。
尽管我们已经在最新的APK中修复了这个权限问题,但声明表单从未消失或无法手动删除。由于同样的旧原因,该应用程序不断被拒绝。有过这种经历或者知道如何解决这个问题的人。
java android android-permissions google-play-console android-11
我需要检查其他应用程序是否具有外部存储管理器的权限。和
Environment.isExternalStorageManager()
Run Code Online (Sandbox Code Playgroud)
我检查当前应用程序是否已被授予。我如何为另一个应用程序执行此操作?我已经尝试检查权限状态
getPackageManager().checkPermission(Manifest.permission.MANAGE_EXTERNAL_STORAGE, "dk.tacit.android.foldersync.lite")
Run Code Online (Sandbox Code Playgroud)
但它总是返回 -1,这意味着 PERMISSION_DENIED,即使授予了权限。
android ×10
android-11 ×10
java ×2
mediastore ×2
delete-file ×1
permissions ×1
root ×1
storage ×1