簡體   English   中英

無法從 Android 中的應用程序自己的外部存儲 (SDcard) 文件夾中共享文件 11

[英]Cannot share file from app own external storage (SDcard) folder in Android 11

我的應用程序具有在 Android 11 中停止工作的共享功能,我不知道為什么。 它適用於任何 Android <= 10。我的應用程序針對 API 29 盡量不陷入范圍存儲問題。 對不起,如果這現在眾所周知,但我基本上對范圍存儲一無所知。

外部 sdcard 中的 app 文件夾為/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, 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.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, 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.714 803-1100/? E/BufferQueueProducer: [com.floritfoto.apps.ave/com.floritfoto.apps.xvf.FileChooser$_13168#0](id:323000009a1,api:0,p:-1,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,api:0,p:-1,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, 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.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, 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.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"

更奇怪的是,我可以在 app 文件夾之外的 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,api:0,p:-1,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, 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: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, consider using Intent#createChooser to launch the ChooserActivity, 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,0-1289,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, 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: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, consider using Intent#createChooser to launch the ChooserActivity, 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,api:0,p:-1,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, 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: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, consider using Intent#createChooser to launch the ChooserActivity, 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 和安卓/obb)。

所以我膽小的解決方法是將要共享的文件復制到主存儲ContextCompat.getExternalCacheDirs(context)[0]中應用程序的 Cache 文件夾中,然后從那里共享文件。 當應用程序關閉時,我會從緩存中刪除此文件。 :/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM