无法从 Android 11

问题描述

我的应用的共享功能在 Android 11 中停止工作,我不知道为什么。它适用于任何 Android

外部 sdcard 中的应用程序文件夹是 /storage/58ED-1620/Android/data/com.floritfoto.apps.ave/在这文件夹中,我有一堆其他文件夹。

如果我尝试共享文件 /storage/58ED-1620/Android/data/com.floritfoto.apps.ave/ornitologia/MyTracks/ave_140321_103008.csv,例如通过 WhatsApp,文件不会发送,这是 logcat (>=Warn): (编辑:如果文件位于 files/ 文件夹内,我似乎可以共享该文件?!)

18:26:08.468 15827-15827/? W/adbd: timeout expired while flushing socket,closing
18:26:09.472 803-1100/? E/BufferQueueProducer: [com.floritfoto.apps.ave/com.floritfoto.apps.xvf.FileChooser$_13168#1](id:323000009a3,api:0,p:-1,c:803) disconnect: not connected (req=1)
18:26:09.472 13168-14775/com.floritfoto.apps.ave W/libEGL: EGLNativeWindowType 0x708d001ec0 disconnect Failed
18:26:09.495 736-758/? E/HYPER-HAL: [HandlerSysfs.cpp]doResourceHandling(): Couldn't Open Sysfs - /sys/power/cstate_control
18:26:09.498 736-758/? E/HYPER-HAL: [HandlerSysfs.cpp]doResourceHandling(): Couldn't Open Sysfs - /sys/power/cstate_control
18:26:09.501 1117-1257/? W/ActivityTaskManager: Tried to set launchTime (0) < mLastActivityLaunchTime (53651559)
18:26:09.504 1117-1257/? W/WindowManager: Execute app transition: mNextAppTransition=TRANSIT_ACTIVITY_OPEN,displayId: 0 Callers=com.android.server.wm.RootwindowContainer.executeAppTransitionForAlldisplay:2586 com.android.server.wm.ActivityStackSupervisor.reportResumedActivityLocked:2225 com.android.server.wm.ActivityRecord.completeResumeLocked:5646 com.android.server.wm.ActivityStack.minimalResumeActivityLocked:1212 com.android.server.wm.ActivityStackSupervisor.realStartActivityLocked:1135
18:26:09.512 5471-5471/? W/ChooserActivity: Ignoring intent's EXTRA_TITLE,deprecated in P. You may wish to set a preview title by using EXTRA_TITLE property of the wrapped EXTRA_INTENT.
18:26:09.512 1117-1379/? W/PkgPredictorService: background app without no launcher icon android for.uid: 1000 userId: 0
18:26:09.513 5471-5471/? E/ActivityThread: Failed to find provider info for com.samsung.android.app.sharestar.ShareStarProvider
18:26:09.560 1117-3258/? E/IntervalStats: Unable to parse usage stats package 1041
18:26:09.560 1117-3258/? E/IntervalStats: Unable to parse usage stats package 1520
18:26:09.560 1117-3258/? E/IntervalStats: Unable to parse usage stats package 1997
18:26:09.618 13168-14876/com.floritfoto.apps.ave E/DatabaseUtils: Writing exception to parcel
    java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://com.floritfoto.apps.ave.provider/root/storage/58ED-1620/Android/data/com.floritfoto.apps.ave/ornitologia/MyTracks/ave_140321_103008.csv from pid=5471,uid=1000 requires the provider be exported,or grantUriPermission()
        at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:841)
        at android.content.ContentProvider.semEnforceReadPermission(ContentProvider.java:758)
        at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:684)
        at android.content.ContentProvider$Transport.query(ContentProvider.java:239)
        at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:106)
        at android.os.Binder.execTransactInternal(Binder.java:1190)
        at android.os.Binder.execTransact(Binder.java:1159)
18:26:09.618 5471-5471/? W/ChooserActivity: Could not load (content://com.floritfoto.apps.ave.provider/root/storage/58ED-1620/Android/data/com.floritfoto.apps.ave/ornitologia/MyTracks/ave_140321_103008.csv) thumbnail/name for preview. If desired,consider using Intent#createChooser to launch the ChooserActivity,and set your Intent's clipData and flags in accordance with that method's documentation
18:26:09.619 2498-3360/? W/NearbySharing: Ignore registering DIRECT_SHARE_SERVICE send surface,due to disabled scanning mediums. [CONTEXT service_id=194 ]
18:26:09.619 2498-3360/? W/NearbySharing: NearbySharingService call registerSendSurface returned nonzero status code for calling package com.google.android.gms: STATUS_disABLED [CONTEXT service_id=194 ]
18:26:09.643 1117-1145/? E/WindowManager: win=Window{a0df760 u0 com.floritfoto.apps.ave/com.floritfoto.apps.xvf.FileChooser EXITING} destroySurfaces: appStopped=false win.mWindowRemovalAllowed=true win.mRemoveOnExit=true win.mViewVisibility=0 caller=com.android.server.wm.ActivityRecord.destroySurfaces:5183 com.android.server.wm.ActivityRecord.destroySurfaces:5164 com.android.server.wm.WindowState.onExitAnimationDone:5570 com.android.server.wm.WindowStateAnimator.onAnimationFinished:332 com.android.server.wm.WindowState.onAnimationFinished:6035 com.android.server.wm.-$$Lambda$dwJG8BAnLlvKNGuDY9U3-haNY4M.onAnimationFinished:2 com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$SurfaceAnimator:112
18:26:09.668 5471-5471/? W/View: requestLayout() improperly called by com.android.internal.widget.RecyclerView{d6a7c8a VFED..... ......ID 0,0-1289,1011 #102047e android:id/resolver_list} during layout: running second layout pass
18:26:09.671 13168-14876/com.floritfoto.apps.ave E/DatabaseUtils: Writing exception to parcel
    java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://com.floritfoto.apps.ave.provider/root/storage/58ED-1620/Android/data/com.floritfoto.apps.ave/ornitologia/MyTracks/ave_140321_103008.csv from pid=5471,or grantUriPermission()
        at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:841)
        at android.content.ContentProvider.semEnforceReadPermission(ContentProvider.java:758)
        at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:684)
        at android.content.ContentProvider$Transport.query(ContentProvider.java:239)
        at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:106)
        at android.os.Binder.execTransactInternal(Binder.java:1190)
        at android.os.Binder.execTransact(Binder.java:1159)
18:26:09.672 5471-5471/? W/ChooserActivity: Could not load (content://com.floritfoto.apps.ave.provider/root/storage/58ED-1620/Android/data/com.floritfoto.apps.ave/ornitologia/MyTracks/ave_140321_103008.csv) thumbnail/name for preview. If desired,and set your Intent's clipData and flags in accordance with that method's documentation
18:26:09.714 803-1100/? E/BufferQueueProducer: [com.floritfoto.apps.ave/com.floritfoto.apps.xvf.FileChooser$_13168#0](id:323000009a1,c:803) disconnect: not connected (req=1)
18:26:09.714 13168-14775/com.floritfoto.apps.ave W/libEGL: EGLNativeWindowType 0x708cee8e80 disconnect Failed
18:26:09.729 736-758/? E/HYPER-HAL: [HandlerSysfs.cpp]doResourceHandling(): Couldn't Open Sysfs - /sys/power/cstate_control
18:26:09.730 736-758/? E/HYPER-HAL: [Request.cpp]acquire(): Request:: id : 648112,No Resource to set
18:26:09.730 2339-2339/? E/pageboostd: Received HALT command code 2
18:26:09.730 736-758/? E/HYPER-HAL: [HandlerSysfs.cpp]doResourceHandling(): Couldn't Open Sysfs - /sys/power/cstate_control
18:26:09.731 803-823/? E/BufferQueueProducer: [android/com.android.internal.app.ChooserActivity$_5471#0](id:323000009a4,c:803) disconnect: not connected (req=1)
18:26:09.731 5471-6304/? W/libEGL: EGLNativeWindowType 0x708cf88930 disconnect Failed
18:26:09.749 13168-14938/com.floritfoto.apps.ave E/DatabaseUtils: Writing exception to parcel
    java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://com.floritfoto.apps.ave.provider/root/storage/58ED-1620/Android/data/com.floritfoto.apps.ave/ornitologia/MyTracks/ave_140321_103008.csv from pid=5471,or grantUriPermission()
        at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:841)
        at android.content.ContentProvider.semEnforceReadPermission(ContentProvider.java:758)
        at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:684)
        at android.content.ContentProvider$Transport.query(ContentProvider.java:239)
        at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:106)
        at android.os.Binder.execTransactInternal(Binder.java:1190)
        at android.os.Binder.execTransact(Binder.java:1159)
18:26:09.749 5471-5471/? W/ChooserActivity: Could not load (content://com.floritfoto.apps.ave.provider/root/storage/58ED-1620/Android/data/com.floritfoto.apps.ave/ornitologia/MyTracks/ave_140321_103008.csv) thumbnail/name for preview. If desired,and set your Intent's clipData and flags in accordance with that method's documentation
18:26:09.888 5471-6332/? E/SharedPreferencesImpl: Couldn't create directory for SharedPreferences file /data/system/shared_prefs/com.android.internal.app.ChooserActivity.xml
18:26:10.028 727-1236/? E/Sensors: Sensor : Meta event
18:26:10.030 736-17022/? E/HYPER-HAL: [HandlerSysfs.cpp]doResourceHandling(): Couldn't Open Sysfs - /sys/power/cstate_control
18:26:10.228 1452-1452/? E/ExpandableNotifRow: onNotificationUpdated() NSSL is null..
18:26:10.499 736-17015/? E/HYPER-HAL: [HandlerSysfs.cpp]doResourceHandling(): Couldn't Open Sysfs - /sys/power/cstate_control

如您所见,我得到了 3 次(为什么是 3??)Permission Denial: ... requires the provider be exported,or grantUriPermission()。但是我的共享活动不仅设置了 Intent.FLAG_GRANT_READ_URI_PERMISSION 标志,而且它在清单文件的提供程序部分中显示android:grantUriPermissions="true"

更奇怪的是,我可以在应用程序文件夹或子文件夹之外的 sdcard 中共享文件 (???!!!)。例如,我可以共享文件 /storage/58ED-1620/System Volume information/WPSettings.dat。看logcat,即使是同样的3个错误,但是文件发送了:

18:29:50.302 803-824/? E/BufferQueueProducer: [com.floritfoto.apps.ave/com.floritfoto.apps.xvf.FileChooser$_13168#1](id:323000009a8,c:803) disconnect: not connected (req=1)
18:29:50.302 13168-14775/com.floritfoto.apps.ave W/libEGL: EGLNativeWindowType 0x708d001ec0 disconnect Failed
18:29:50.325 736-758/? E/HYPER-HAL: [HandlerSysfs.cpp]doResourceHandling(): Couldn't Open Sysfs - /sys/power/cstate_control
18:29:50.328 736-758/? E/HYPER-HAL: [HandlerSysfs.cpp]doResourceHandling(): Couldn't Open Sysfs - /sys/power/cstate_control
18:29:50.331 1117-2951/? W/ActivityTaskManager: Tried to set launchTime (0) < mLastActivityLaunchTime (54810092)
18:29:50.333 1117-2951/? W/WindowManager: Execute app transition: mNextAppTransition=TRANSIT_ACTIVITY_OPEN,displayId: 0 Callers=com.android.server.wm.RootwindowContainer.executeAppTransitionForAlldisplay:2586 com.android.server.wm.ActivityStackSupervisor.reportResumedActivityLocked:2225 com.android.server.wm.ActivityRecord.completeResumeLocked:5646 com.android.server.wm.ActivityStack.minimalResumeActivityLocked:1212 com.android.server.wm.ActivityStackSupervisor.realStartActivityLocked:1135 
18:29:50.340 5471-5471/? W/ChooserActivity: Ignoring intent's EXTRA_TITLE,deprecated in P. You may wish to set a preview title by using EXTRA_TITLE property of the wrapped EXTRA_INTENT.
18:29:50.342 1117-1379/? W/PkgPredictorService: background app without no launcher icon android for.uid: 1000 userId: 0
18:29:50.343 5471-5471/? E/ActivityThread: Failed to find provider info for com.samsung.android.app.sharestar.ShareStarProvider
18:29:50.387 1117-1135/? E/IntervalStats: Unable to parse usage stats package 1041
18:29:50.387 1117-1135/? E/IntervalStats: Unable to parse usage stats package 1520
18:29:50.387 1117-1135/? E/IntervalStats: Unable to parse usage stats package 1997
18:29:50.436 2498-3360/? W/NearbySharing: Ignore registering DIRECT_SHARE_SERVICE send surface,due to disabled scanning mediums. [CONTEXT service_id=194 ]
18:29:50.436 2498-3360/? W/NearbySharing: NearbySharingService call registerSendSurface returned nonzero status code for calling package com.google.android.gms: STATUS_disABLED [CONTEXT service_id=194 ]
18:29:50.438 13168-14876/com.floritfoto.apps.ave E/DatabaseUtils: Writing exception to parcel
    java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://com.floritfoto.apps.ave.provider/root/storage/58ED-1620/System%20Volume%20information/WPSettings.dat from pid=5471,or grantUriPermission()
        at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:841)
        at android.content.ContentProvider.semEnforceReadPermission(ContentProvider.java:758)
        at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:684)
        at android.content.ContentProvider$Transport.query(ContentProvider.java:239)
        at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:106)
        at android.os.Binder.execTransactInternal(Binder.java:1190)
        at android.os.Binder.execTransact(Binder.java:1159)
18:29:50.438 5471-5471/? W/ChooserActivity: Could not load (content://com.floritfoto.apps.ave.provider/root/storage/58ED-1620/System%20Volume%20information/WPSettings.dat) thumbnail/name for preview. If desired,and set your Intent's clipData and flags in accordance with that method's documentation
18:29:50.466 1117-1145/? E/WindowManager: win=Window{19b8866 u0 com.floritfoto.apps.ave/com.floritfoto.apps.xvf.FileChooser EXITING} destroySurfaces: appStopped=false win.mWindowRemovalAllowed=true win.mRemoveOnExit=true win.mViewVisibility=0 caller=com.android.server.wm.ActivityRecord.destroySurfaces:5183 com.android.server.wm.ActivityRecord.destroySurfaces:5164 com.android.server.wm.WindowState.onExitAnimationDone:5570 com.android.server.wm.WindowStateAnimator.onAnimationFinished:332 com.android.server.wm.WindowState.onAnimationFinished:6035 com.android.server.wm.-$$Lambda$dwJG8BAnLlvKNGuDY9U3-haNY4M.onAnimationFinished:2 com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$SurfaceAnimator:112 
18:29:50.494 5471-5471/? W/View: requestLayout() improperly called by com.android.internal.widget.RecyclerView{9370694 VFED..... ......ID 0,1011 #102047e android:id/resolver_list} during layout: running second layout pass
18:29:50.497 13168-14876/com.floritfoto.apps.ave E/DatabaseUtils: Writing exception to parcel
    java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://com.floritfoto.apps.ave.provider/root/storage/58ED-1620/System%20Volume%20information/WPSettings.dat from pid=5471,or grantUriPermission()
        at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:841)
        at android.content.ContentProvider.semEnforceReadPermission(ContentProvider.java:758)
        at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:684)
        at android.content.ContentProvider$Transport.query(ContentProvider.java:239)
        at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:106)
        at android.os.Binder.execTransactInternal(Binder.java:1190)
        at android.os.Binder.execTransact(Binder.java:1159)
18:29:50.498 5471-5471/? W/ChooserActivity: Could not load (content://com.floritfoto.apps.ave.provider/root/storage/58ED-1620/System%20Volume%20information/WPSettings.dat) thumbnail/name for preview. If desired,and set your Intent's clipData and flags in accordance with that method's documentation
18:29:50.553 736-758/? E/HYPER-HAL: [HandlerSysfs.cpp]doResourceHandling(): Couldn't Open Sysfs - /sys/power/cstate_control
18:29:50.553 736-758/? E/HYPER-HAL: [Request.cpp]acquire(): Request:: id : 648112,No Resource to set
18:29:50.553 736-758/? E/HYPER-HAL: [HandlerSysfs.cpp]doResourceHandling(): Couldn't Open Sysfs - /sys/power/cstate_control
18:29:50.554 803-1997/? E/BufferQueueProducer: [android/com.android.internal.app.ChooserActivity$_5471#0](id:323000009a9,c:803) disconnect: not connected (req=1)
18:29:50.554 5471-6304/? W/libEGL: EGLNativeWindowType 0x708cf6ac50 disconnect Failed
18:29:50.557 2339-2339/? E/pageboostd: Received HALT command code 2
18:29:50.569 13168-14876/com.floritfoto.apps.ave E/DatabaseUtils: Writing exception to parcel
    java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://com.floritfoto.apps.ave.provider/root/storage/58ED-1620/System%20Volume%20information/WPSettings.dat from pid=5471,or grantUriPermission()
        at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:841)
        at android.content.ContentProvider.semEnforceReadPermission(ContentProvider.java:758)
        at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:684)
        at android.content.ContentProvider$Transport.query(ContentProvider.java:239)
        at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:106)
        at android.os.Binder.execTransactInternal(Binder.java:1190)
        at android.os.Binder.execTransact(Binder.java:1159)
18:29:50.569 5471-5471/? W/ChooserActivity: Could not load (content://com.floritfoto.apps.ave.provider/root/storage/58ED-1620/System%20Volume%20information/WPSettings.dat) thumbnail/name for preview. If desired,and set your Intent's clipData and flags in accordance with that method's documentation
18:29:50.703 5471-6332/? E/SharedPreferencesImpl: Couldn't create directory for SharedPreferences file /data/system/shared_prefs/com.android.internal.app.ChooserActivity.xml
18:29:50.725 727-1236/? E/Sensors: Sensor : Meta event
18:29:50.853 736-17345/? E/HYPER-HAL: [HandlerSysfs.cpp]doResourceHandling(): Couldn't Open Sysfs - /sys/power/cstate_control
18:29:50.919 1452-1452/? E/ExpandableNotifRow: onNotificationUpdated() NSSL is null..
18:29:51.329 736-17338/? E/HYPER-HAL: [HandlerSysfs.cpp]doResourceHandling(): Couldn't Open Sysfs - /sys/power/cstate_control

我看不出两个 logcat 之间有什么真正不同!

我不知道为什么这会在 Android 11 中开始发生。我做错了什么?这与范围存储有关吗?我应该迁移到作用域存储吗?

这是文件共享方法

public static void sharefile(Context context,String calledfrom,String filename) {
    Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
    sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    sharingIntent.putExtra(Intent.EXTRA_STREAM,(new SearchOut()).getUriFromFile(context,calledfrom,new File(filename)));
    sharingIntent.putExtra(Intent.EXTRA_SUBJECT,FName.file(filename));
    sharingIntent.setType((new FileChooser()).getMimeType(filename));
    context.startActivity(Intent.createChooser(sharingIntent,filename));
}

编辑:在上面,getUriFromFile 方法本质上是 Android >=7 的常用方法FileProvider.getUriForFile(context,auth + ".provider",file);

这是我在清单中的提供者数据:

    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <Meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>

这是我的provider_paths.xml

 <?xml version="1.0" encoding="utf-8"?>
 <paths>
    <external-path name="external_files" path="." />
    <root-path name="root" path="." />
 </paths>

解决方法

这不是一个真正的解决方案,而是一个愚蠢的解决方法。对不起。

似乎在 Android 11 中,我们无法通过 FileProvider 共享外部可移动 micro sdcard 存储中应用程序自己的文件中的文件:技巧

<root-path name="root" path="." />

在提供程序路径中,.xml 文件不再适用于可移动存储中自己的应用程序文件夹(感谢 @blackapps !)。 (但是,它仍然适用于可移动存储中的其他文件夹,除了 Android/data 和 Android/obb 中的文件夹)。

所以我胆小的解决方法是将要共享的文件复制到主存储器 ContextCompat.getExternalCacheDirs(context)[0] 中应用程序的缓存文件夹中,然后从那里共享文件。当应用程序关闭时,我从缓存中删除这个文件。 :/