Xamarin.Plugin.FilePicker-内容:/com.android.providers.downloads.documents问题

如何解决Xamarin.Plugin.FilePicker-内容:/com.android.providers.downloads.documents问题

我正在使用Xamarin.Plugin.FilePicker(版本为:2.1.41)。它在android 10设备中给了我这样的路径: content://com.android.providers.downloads.documents/document/3025或 content://com.android.providers.downloads.documents/document/msf:14

我正在尝试通过这种方式获取真实的文件路径:

public class StorageFolderPath : IStorageFolderPath
{
    public string SDCardPath(string path)
    {
        Android.Net.Uri uri = Android.Net.Uri.Parse(path);
            bool isKitKat = Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Kitkat;

        if (isKitKat && DocumentsContract.IsDocumentUri(MainActivity.MainContext,uri))
        {
            if (isExternalStorageDocument(uri))
            {
                //...
            }
            else if (isDownloadsDocument(uri))
            {
                string id = DocumentsContract.GetDocumentId(uri);
                Android.Net.Uri contentUri = ContentUris.WithAppendedId(
                                        Android.Net.Uri.Parse("content://downloads/public_downloads"),ContentUris.ParseId(uri));
                return getDataColumn(MainActivity.MainContext,contentUri,null,null);
            }
            //...
        }
    }

    public static String getDataColumn(Context context,Android.Net.Uri uri,String selection,String[] selectionArgs)
        {
            ICursor cursor = null;
            String column = "_data";
            String[] projection =
            {
                column
            };

            try
            {
                cursor = context.ContentResolver.Query(uri,projection,selection,selectionArgs,null);
                if (cursor != null && cursor.MoveToFirst())
                {
                    int index = cursor.GetColumnIndexOrThrow(column);
                    return cursor.GetString(index);
                }
            }
            finally
            {
                if (cursor != null)
                    cursor.Close();
            }
            return null;
        }

    public static bool isDownloadsDocument(Android.Net.Uri uri)
        {
            return "com.android.providers.downloads.documents".Equals(uri.Authority);
        }

    public bool DownloadsDocumentControl(string path)
        {
            Android.Net.Uri uri = Android.Net.Uri.Parse(path);
            return isDownloadsDocument(uri);
        }
}

共享代码:

public async Task UploadFileAsync(UploadRequest upload_request)
{
    string newPath = "";
    if (Device.RuntimePlatform == Device.Android && 
       (DependencyService.Get<IStorageFolderPath>().ExternalStorageDocumentControl(upload_request.Properties.FilePath) ||
       DependencyService.Get<IStorageFolderPath>().DownloadsDocumentControl(upload_request.Properties.FilePath)))
        newPath = DependencyService.Get<IStorageFolderPath>().SDCardPath(upload_request.Properties.FilePath);
    else
        newPath = upload_request.Properties.FilePath;

    Stream stream = File.OpenRead(newPath);
    //...
}

当我这样做时: 如果路径为content://com.android.providers.downloads.documents/document/msf:14,则应用会引发以下错误:

{Java.Lang.NumberFormatException: For input string: "msf:14"
  at Java.Interop.JniEnvironment+StaticMethods.CallStaticLongMethod (Java.Interop.JniObjectReference type,Java.Interop.JniMethodInfo method,Java.Interop.JniArgumentValue* args) [0x0006e] in <42748fcc36b74733af2d9940a8f3cc8e>:0 
  at Java.Interop.JniPeerMembers+JniStaticMethods.InvokeInt64Method (System.String encodedMember,Java.Interop.JniArgumentValue* parameters) [0x00018] in <42748fcc36b74733af2d9940a8f3cc8e>:0 
  at Android.Content.ContentUris.ParseId (Android.Net.Uri contentUri) [0x00031] in <7d2292394f8c488b97f5bc2a0ac0240d>:0 
  at FileOrbis.Droid.Services.StorageFolderPath.SDCardPath (System.String path) [0x0017c] in C:\Users\Deytek\Desktop\GitWorkspace\FileorbisMobil\FileOrbis\FileOrbis.Android\Services\StorageFolderPath.cs:91 
  at FileOrbis.Services.AllFileUploadService.UploadFileAsync (FileOrbis.Models.RequestModels.UploadRequest upload_request) [0x000ae] in C:\Users\Deytek\Desktop\GitWorkspace\FileorbisMobil\FileOrbis\FileOrbis\Services\AllFileUploadService.cs:69 
  --- End of managed Java.Lang.NumberFormatException stack trace ---
java.lang.NumberFormatException: For input string: "msf:14"
    at java.lang.Long.parseLong(Long.java:594)
    at java.lang.Long.parseLong(Long.java:636)
    at android.content.ContentUris.parseId(ContentUris.java:89)
}

(应用程序在此行崩溃:(在ContentUris.ParseId(uri)上)

Android.Net.Uri contentUri = ContentUris.WithAppendedId(
                                        Android.Net.Uri.Parse("content://downloads/public_downloads"),ContentUris.ParseId(uri));)

如果路径为content://com.android.providers.downloads.documents/document/3025,则应用会引发以下错误:

{System.IO.DirectoryNotFoundException: Could not find a part of the path "/content:/com.android.providers.downloads.documents/document/3025".
  at System.IO.FileStream..ctor (System.String path,System.IO.FileMode mode,System.IO.FileAccess access,System.IO.FileShare share,System.Int32 bufferSize,System.Boolean anonymous,System.IO.FileOptions options) [0x00177] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/corlib/System.IO/FileStream.cs:223 
  at System.IO.FileStream..ctor (System.String path,System.IO.FileShare share) [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/corlib/System.IO/FileStream.cs:91 
  at (wrapper remoting-invoke-with-check) System.IO.FileStream..ctor(string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare)
  at System.IO.File.OpenRead (System.String path) [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.IO.FileSystem/src/System/IO/File.cs:266 
  at FileOrbis.Services.AllFileUploadService.UploadFileAsync (FileOrbis.Models.RequestModels.UploadRequest upload_request) [0x000de] in C:\Users\Deytek\Desktop\GitWorkspace\FileorbisMobil\FileOrbis\FileOrbis\Services\AllFileUploadService.cs:73 }

注意:

我已添加到清单文件中

<application android:requestLegacyExternalStorage="true">
</application>

该问题我必须在Android 10设备上做什么? (我没有在所有android 10设备上都遇到此问题。我在三星Galaxy S10-模拟器,Huawei P20 Lite-真实电话或Galaxy S20-真实电话上遇到)

解决方法

blackapps说的是真的。 Already FilePicker plugin has notified that is possible.但我现在看到了。

从内容方案获取实际路径不是正确的方法,也是不可能的。 这就是为什么我必须在代码上写条件代码的原因:

Stream stream = null;
if (Device.RuntimePlatform == Device.Android && DependencyService.Get<IStorageFolderPath>().DownloadsDocumentControl(newPath))
     stream = DependencyService.Get<IStorageFolderPath>().GetFileFromUri(newPath);
else
     stream = File.OpenRead(newPath);
public Stream GetFileFromUri(string path)
{
     Android.Net.Uri uri = Android.Net.Uri.Parse(path);
     var stream = MainActivity.MainContext.ContentResolver.OpenInputStream(uri);
     return stream;
}
,

您可以查询文件名,然后构建路径。

  • 查询文件名:

    public static string getFileName(Context context,Android.Net.Uri uri)
    {
        ICursor cursor = null;
        string[] projection = {
            MediaStore.MediaColumns.DisplayName
        };
    
        try
        {
            cursor = context.ContentResolver.Query(uri,projection,null,null);
            if (cursor != null && cursor.MoveToFirst())
            {
                int index = cursor.GetColumnIndexOrThrow(MediaStore.MediaColumns.DisplayName);
                return cursor.GetString(index);
            }
        }
        finally
        {
            if (cursor != null)
                if (cursor != null)
                {
                    cursor.Close();
                }
        }
        return null;
    }
    

构建路径:

            else if (isDownloadsDocument (uri)) {

                string fileName = getFileName(context,uri);
                string filePath = Android.OS.Environment.ExternalStorageDirectory + "/Download/" + fileName;
                return filePath;
            }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res