将文件传递到API等级为24的华为平板电脑上的其他应用程序

问题描述 投票:0回答:1

我的应用程序正在创建PDF并将其传递给其他应用程序,以便在其他地方显示。我在内部存储中创建文件,以便要求用户减少权限。

我创建了我的意图:

Intent viewIntent = new Intent(Intent.ActionView);
Java.IO.File document = new Java.IO.File(filePath);
Android.Net.Uri contentUri = FileProvider.GetUriForFile(
    _context,
    _context.PackageName + ".provider",
    document);

viewIntent.SetDataAndType(contentUri, GetMimeType(document));
viewIntent.SetFlags(ActivityFlags.NewTask);
viewIntent.AddFlags(ActivityFlags.GrantReadUriPermission);
viewIntent.AddFlags(ActivityFlags.ClearTask);
viewIntent.AddFlags(ActivityFlags.GrantPersistableUriPermission);
viewIntent.AddFlags(ActivityFlags.GrantPrefixUriPermission);
viewIntent.AddFlags(ActivityFlags.GrantWriteUriPermission);
Intent chooser = Intent.CreateChooser(viewIntent, "");
chooser.SetFlags(ActivityFlags.NewTask);
chooser.AddFlags(ActivityFlags.GrantReadUriPermission);
chooser.AddFlags(ActivityFlags.ClearTask);
chooser.AddFlags(ActivityFlags.GrantPersistableUriPermission);
chooser.AddFlags(ActivityFlags.GrantPrefixUriPermission);
chooser.AddFlags(ActivityFlags.GrantWriteUriPermission);

_context.StartActivity(viewIntent);

在我测试的Google Pixel 3 XL上,我可以打开PDF而不会出现任何问题。

当我在具有API级别24的华为平板电脑上执行相同操作时,有时一切正常,但在其他时候Adobe Acrobat显示错误:This file could not be accessed. Check the location or the network and try again.

这种行为不是确定性的,有时候我会得到错误,但有时候一切正常。

android xamarin xamarin.android android-permissions
1个回答
0
投票

在Android Manifest的Application节点中,确保已添加FileProvider定义:

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

添加包含以下内容的Resources/xml/provider_paths文件:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
  <external-path name="external_files" path="."/>
</paths>

如果需要,您可以稍后限制。但是,对于我的用例,我将文件放在我共享的外部存储器中。您需要根据共享的位置进行相应调整。

即如果您要从内部应用程序存储共享文件,则还需要在其中添加files-path定义。

然后在共享文件时,您只需:

var packageName = context.ApplicationInfo.PackageName;
var fileProviderName = $"{packageName}.FileProvider";

var intent = new Intent(Intent.ActionSend);
intent.AddFlags(ActivityFlags.GrantReadUriPermission);
intent.SetType("image/*"); // change mime type if wanting to open in other app
intent.PutExtra(Intent.ExtraStream,
    FileProvider.GetUriForFile(context, fileProviderName, new Java.IO.File(filePath)));

StartActivity(intent);

这应该足够了,每次我都可以将图像分享给另一个应用程序。我认为你不需要你的选择器Intent的标志,只有内部viewIntent。如果你提供旗帜,GrantReadUriPermission应该是唯一需要的东西。

© www.soinside.com 2019 - 2024. All rights reserved.