当前位置: 首页 > 知识库问答 >
问题:

Xamarin Android-FilePickerActivity-无故取消

柳珂
2023-03-14

我有一些在Android上挑选文件的代码。我从网上找的。实际上,代码在一个场景下工作,但在我的应用程序中,它不工作。Android认为用户取消了文件选择,而实际上他们还没有。

private Task<FileData> PickAndOpenFile(bool isSave)
{
    var id = GetRequestId();

    var ntcs = new TaskCompletionSource<FileData>(id);

    if (Interlocked.CompareExchange(ref _CompletionSource, ntcs, null) != null)
    {
        throw new InvalidOperationException("Only one operation can be active at a time");
    }

    try
    {
        var pickerIntent = new Intent(_Context, typeof(FilePickerActivity));
        pickerIntent.SetFlags(ActivityFlags.NewTask);

        _Context.StartActivity(pickerIntent);

        EventHandler<FilePickerEventArgs> handler = null;
        EventHandler<EventArgs> cancelledHandler = null;

        handler = (s, e) =>
        {
            var tcs = Interlocked.Exchange(ref _CompletionSource, null);

            FilePickerActivity.FilePicked -= handler;

            Stream fileStream = isSave ? File.OpenRead(e.FilePath) : File.OpenWrite(e.FilePath);

            tcs?.SetResult(new FileData { FileName = e.FileName, FileStream = fileStream });
        };

        cancelledHandler = (s, e) =>
        {
            var tcs = Interlocked.Exchange(ref _CompletionSource, null);

            FilePickerActivity.FilePickCancelled -= cancelledHandler;

            tcs?.SetResult(null);
        };

        FilePickerActivity.FilePickCancelled += cancelledHandler;
        FilePickerActivity.FilePicked += handler;
    }
    catch (Exception exAct)
    {
        Debug.Write(exAct);
    }

    return _CompletionSource.Task;
}
            var filePicker = App.PlatformSpecificStartupArguments.PresentationFactory.CreateFilePicker();
            using (var fileData = await filePicker.PickAndOpenFileForReading())
            {
                if (fileData == null)
                {
                    return;
                }

                using (var readFileStream = fileData.FileStream)
                {
                    var fileExtension = Path.GetExtension(fileData.FileName);
                    var relativeUri = Guid.NewGuid() + fileExtension;
                    await OnPictureTakenAsync(this, new PictureTakenEventArgs(readFileStream, relativeUri, fileData.FileName));
                }
            }

但是,当我选择文件(从现有图像中选择一个图像)时,代码进入cancelledHandler。这显然是一个权限问题,因为我在设备日志中收到以下错误消息:

08-02 15:15:28.697 LGE Nexus 5X错误18911 DatabaseUtils java.lang.SecurityException:权限拒绝:从PID=18684,UID=10221读取com.android.providers.media.mediaProvider uri内容://media/external/images/media,需要android.Permission.read_external_storage或android.content.contentProvider.EnforceRadPermissionInner(contentProvider.java:608)或

所以,我在Visual Studio级别的Android清单中打开了这个权限,但问题仍然存在。我所针对的Android版本是6.0。您可以看到,在上面提到的repo中,目标版本被设置为“use compile using SDK version”。而且我甚至还没有将READ_EXTERNAL_STORAGE添加到示例应用程序中。

共有1个答案

孟光耀
2023-03-14

我在Visual Studio级别的Android清单中打开了此权限,但问题仍然存在。

从Android6.0(API级别23)开始,用户在应用程序运行时授予应用程序权限,而不是在安装应用程序时授予应用程序权限。您应该在运行时请求权限。

系统权限分为两类,正常和危险:

    null

read_external_storage分为危险权限,因此您应该手动检查API级别23及更高级别的权限。

下面是一个关于如何在运行时请求权限的示例。

 类似资料:
  • 我有一个bean生产者和一个bean消费者,在一条路由中使用。生产者是通过一个线程产生的,并监听hazelcast队列上的数据(它可能是其他任何东西,甚至是本地随机生成的数据)。 数据被发送到sedaendpoint,以确保并发性。使用者获取数据并将其转发到另一个hazelcast队列。但也可能是其他任何东西。 然后在300秒内静止处理并停止。 下面是一些代码: 制片人: 谢了!

  • 我不知所措。 我有一个数据类'Order',它有一个字段。当我试图在接受的方法中使用这个时,我会得到一个编译器错误,其内容如下: 我使用的是Java11、Spring JPA和PostgreSQL。 我从未在Java中见过这样的编译器错误(经过多年的编程),我不知所措。

  • 我试图读取来自CXF拦截器的SOAP错误消息,但我无法提取,我捕获了来自Fidler的响应 以下是菲德勒的回应 以下是我的代码 向客户端添加了FaultInterceptor

  • 完全新的Java和J汤。我试图创建一个简单的程序,刮网络,给我Java股市的数据。我想从道琼斯股票开始,让它打印出52周的区间数据。它转到http://finance.yahoo.com/quote/AAPL?ltr=1,查看左下表(从上一次收盘价开始),然后下到第5个索引,从那里获取文本值。我得到的错误: 线程“main”组织中出现异常。jsoup。选择选择器$SelectorParseExce

  • 我试图通过传递故事格式化ID来查找特定故事下的任务列表,但我没有得到该故事下列出的任务。 我尝试将projectRef和WorkspaceRef传递给QueryFiletr,尽管我已经传递了Story FormattedID,这实际上已经足够了。 请让我知道,代码有什么问题。。。

  • 这似乎是一个永无止境的故事,但我无法从Twitter4J流API访问Twitter。 > 我创建了一个Twitter帐户,并将时区更改为我的祖国 我在Twitter上创建了一个App 我创建了一个ClientApp在Java /Maven与Twitter4J流API 4.0.0 我在配置生成器中放置了Api-Key、秘密密钥和访问令牌 我从推特上得到一个例外 401:身份验证凭据(https://