代码之家  ›  专栏  ›  技术社区  ›  Christian

在API级别为24的华威平板电脑上将文件传递给其他应用程序

  •  0
  • Christian  · 技术社区  · 5 年前

    我的应用程序正在创建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.

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

    0 回复  |  直到 5 年前
        1
  •  0
  •   Cheesebaron    5 年前

    Application Android清单的节点确保添加了文件提供程序定义:

    <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 如果你提供旗帜,这应该是唯一需要的东西。