仅当用户使用存储访问框架选择文件夹时,我们才会获得树 URI。文档提到,从 Android 11 开始,我们可以使用原始文件路径来访问文件。我需要这个,以便我可以使用现有的本机库。但我找不到任何关于获取给定树 URI 的原始路径的文档。如何在 Android 11 上获取给定树 URI 的文件路径?
请注意,stackoverflow 上的所有现有答案都是 hack,它们现在甚至不起作用。我需要一个官方 API。
我正在开发一个应用程序,它严重依赖 jobScheduler 在后台执行多个任务。从下一个 api 版本(android11、api 30)开始,文档(以及开发者预览版)指出:
JobScheduler will throttle runaway applications. Calling schedule(android.app.job.JobInfo) and other such methods with very high frequency is indicative of an app bug and so, to make sure the system doesn't get overwhelmed, JobScheduler will begin to throttle apps that show buggy behavior, regardless of target SDK version.
Run Code Online (Sandbox Code Playgroud)
但我找不到任何关于 jobScheduler 的“正常”使用的规范。
我尝试查找源代码,但在 AOSP 下找不到 android11 分支,并且在build-numbers列表下没有提及它。
他们确实提供了一个模拟器版本来执行测试,但我更喜欢知道我的边界(而不是执行一系列测试只是为了弄清楚这些数字是什么)。
如果有人能给我指出功能规格或 android11 源代码,我将不胜感激。
当面向 Android 11/API 30 时,应用程序将不再能够始终从应用程序内部请求访问位置数据——此选项已从应用程序内权限对话框中删除。如果应用程序想要在后台始终访问用户位置的权限,则需要从应用程序的系统设置屏幕中授予权限。我知道我可以从手机的设置、应用信息、位置权限中进行设置……这样,我必须手动打开“设置”。如何使用 Intent 在我的应用程序内以编程方式启动我的应用程序的位置权限设置活动?
在官方 android 文档中,提到setGravity当在文本 toast 上调用时,toast 上的方法将是无操作的 - 对于针对 Android 的应用程序Build.VERSION_CODES#R,
我自己从上面的理解是,setGravity对于具有目标 API 的应用程序,其上设置的 文本 toastBuild.VERSION_CODES#R将根本不尊重使用
setGravity方法设置的重力配置。
如果这种理解成立,是否有其他方法可以通过应用程序定位来调整文本吐司的重力Build.VERSION_CODES#R?
另外,从设计的角度来看,对文本吐司施加这种限制的可能原因是什么?
我正在尝试使用 android studio 中提供的 android 11 模拟器测试我的混合应用程序。但是,对请求filesystem的cordova文件插件返回null的值externalRootDirectory。在我的代码中,我检查了这个值来初始化 app 文件夹,现在它不起作用。
我使用了cordovaandroid 8.0.0、cordova文件插件 6.0.2 和文件传输 1.7.0。
在 android 11 中测试时有人遇到同样的问题吗?
编辑:
在cordova文件插件中调试时,我们发现cordova没有提供android 11模拟器中外部缓存目录的路径。有人知道这个变化吗?
是否有人注意到 Android 11 上有任何明显的生命周期变化?
我的应用程序在 Android 11 之前的操作系统上运行良好,但在我的 Pixel 4 上每次都崩溃并出现错误:
E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.IllegalStateException: Fragment host has been destroyed
Run Code Online (Sandbox Code Playgroud)
是否有任何其他人注意到会影响他们在 Android 11 上的应用?
我正在使用不同的文件,用于活动和片段。
我有一个TreasureHuntActivity调用 onCreate:
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.container, TreasureHuntMapFragment.newInstance(), "map-${index}").addToBackStack("map-${index}").commit()
fragmentManager.executePendingTransactions()
Run Code Online (Sandbox Code Playgroud)
在TreasureHuntMapFragment它调用
val intent = Intent(context, MainUnityActivity::class.java)
activity.startActivityForResult(intent, 33)
Handler().postDelayed({ activity.pushQuestionHintFragment() }, 1000)
Run Code Online (Sandbox Code Playgroud)
回到TreasureHuntActivity它调用TreasureHuntQuestionHintFragment显示
fun pushQuestionHintFragment() {
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.container, TreasureHuntQuestionHintFragment.newInstance(), "questionHintFragment-${specificQuestionId}").addToBackStack("questionHintFragment-${specificQuestionId}").commitAllowingStateLoss()
fragmentManager.executePendingTransactions()
}
Run Code Online (Sandbox Code Playgroud)
这适用于 Android 11 之前的版本,它可以完美运行,如前所述,它现在不适用于 11+。随着进一步调试,它显示fragmentManager为空,之前
var fragmentManager = supportFragmentManager …
android android-fragments android-activity kotlin android-11
我有一个将视频录制到共享 MOVIES 文件夹的应用程序。
我可以使用contentResolver.delete(uri, null, null)我录制的视频活动中的方法删除 Android 11 (API 30) 上的这些文件。
但是,如果我重新安装该应用程序,那么它就会失去对这些文件的权限......(如此糟糕),在这种情况下,我需要做这样的事情:
try {
context.contentResolver.delete(uri, null, null)
} catch (exception: Exception) {
if (exception is RecoverableSecurityException) {
val intentSender = exception.userAction.actionIntent.intentSender
intentSender?.let {
callback?.startIntentSenderForResult(
intentSender,
requestCode
)
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此它无法删除文件,ContentResolver因为应用程序已重新安装,并且有一个例外,我们可以捕获并打开下一个烦人的对话框以供用户确认删除(并且对于每个文件删除,它应该是一个不同的对话框,多次删除 - 否道路)
然后我在这个 Android 11 设备(模拟器)上安装了来自 Google Play 的 Explorer 应用程序,当我打开它时,该应用程序只要求存储写入权限(我的应用程序也这样做)并且这个 Explorer 应用程序可以轻松删除任何文件(包括我录制的视频)文件)没有任何确认对话框。
那么他们是如何做到的呢?这是一个黑客还是什么?
链接到应用程序https://play.google.com/store/apps/details?id=com.speedsoftware.explorer
更新
VLC for Android 也可以删除任何媒体文件https://play.google.com/store/apps/details?id=org.videolan.vlc
他们也使用内容提供程序,所以它是一样的,但它返回的true不像我的应用程序,为什么?
fun deleteFile(file: File): Boolean {
var deleted: Boolean
//Delete from …Run Code Online (Sandbox Code Playgroud) 正如标题所暗示的那样,SpeechRecognizer.isRecognitionAvailable()在 Android 11 中返回 false,我不确定为什么会这样,因为设备 (Pixel 3 XL) 可以识别语音。该文档并未表明它在 API v30 中发生了变化。奇怪的是,即使isRecognitionAvailable是false ,我仍然成功获得STT提示。下面是说明这一点的示例代码。为什么 isRecognitionAvailable 检查总是错误的?无论如何,代码都不完整,但我添加了重要的相关部分:
AndroidManifest.xml
...
<uses-permission android:name="android.permission.RECORD_AUDIO" />
...
Run Code Online (Sandbox Code Playgroud)
MainActivity.kt
...
override fun onCreate(savedInstanceState: Bundle?) {
...
if(ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
if(shouldShowRequestPermissionRationale(Manifest.permission.RECORD_AUDIO)) { //rationale prompt
}
val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()
){ isGranted: Boolean ->
if(isGranted) { checkSTT() }
else { //error perms not granted
}
requestPermissionLauncher.launch(Manifest.permission.RECORD_AUDIO)
} else { checkSTT() }
}
private fun checkSTT() {
if(SpeechRecognizer.isRecognitionAvailable(this)) { runSTT() }
else …Run Code Online (Sandbox Code Playgroud) 我在使用 api 29 和 api 30 编译的应用程序中收到了这封电子邮件。
这些应用程序不包含 requestLegacyExternalStorage标志,也不包含 MANAGE_EXTERNAL_STORAGE.
我已经在清单合并日志和最终合并的清单中搜索过,并没有requestLegacyExternalStorage在里面找到标志。
这些应用程序只有旧的和已弃用WRITE_EXTERNAL_STORAGE的AndroidManifest.xml:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)
是否是从谷歌发出警告的旧的和已弃用的许可?从我的应用程序中删除该权限就足以解决这个问题吗?
从 5 月 5 日起,您必须让我们知道为什么您的应用需要广泛的存储访问权限
我们检测到您的应用
requestLegacyExternalStorage在manifest1 个或多个 app bundle 或 APK的文件中包含该 标志。在运行Android 11+ 的设备上使用应用的开发人员必须使用 Scoped Storage 来让用户更好地控制他们的设备存储。要在 5 月 5 日之后在Android 11或更高版本上发布您的应用,您必须:
更新您的应用程序以使用更多隐私友好的最佳实践,例如存储访问
Framework或Media Store API更新您的应用以
MANAGE_EXTERNAL_STORAGE在清单文件中声明所有文件访问 ( ) 权限,并从 5 月 5 日起在 Play 管理中心完成所有文件访问权限声明从您的应用程序中完全删除所有文件访问权限
对于面向Android 11 的应用,该 …
android android-permissions android-external-storage android-10.0 android-11
我通常在我的物理设备上运行我的应用程序。但是 2 天前我将其更新为 Android 11(Vivo Z1 Pro),更新后,我无法做到。它只是被卡住了
I/flutter (15748): Observatory listening on ************************************
该应用程序已更新,但我无法获得任何实时更新……例如热重载等
android-11 ×10
android ×8
android-10.0 ×1
android-file ×1
cordova ×1
flutter ×1
kotlin ×1
port ×1