【问题标题】:StartActivity - ActionView cannot open document - XamarinStartActivity - ActionView 无法打开文档 - Xamarin
【发布时间】:2020-09-01 01:39:51
【问题描述】:
var storage_path = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath;

filePathh = Path.Combine(storage_path, filename); 

Java.IO.File file = new Java.IO.File(filePathh); 
Console.WriteLine("Downloaded file PATH: " + Query.filePathh);

Intent open = new Intent(Intent.ActionView);
open.AddFlags(ActivityFlags.GrantReadUriPermission);
open.SetFlags(ActivityFlags.NewTask);

Context context = Android.App.Application.Context;

Android.Net.Uri fileUri = FileProvider.GetUriForFile(context, "com.companyname.Login.provider", file).NormalizeScheme();
Console.WriteLine("File uri: " + fileUri.Path);
open.SetDataAndType(fileUri, "*/*");

Intent intentC = Intent.CreateChooser(open, "Open With");
intentC.AddFlags(ActivityFlags.GrantReadUriPermission);

intentC.SetFlags(ActivityFlags.NewTask);
Android.App.Application.Context.StartActivity(intentC);


尝试打开文件时(选择应用程序以打开它 - 如docs或html reader),我们获取未找到错误文件。

我们看到 filePathhfileUri 是不同的,并且没有指向同一个位置。
对于 storage_path: storage/emulated/0/Download/How_to_initialize_your_Xamarin_app_to_use_AppConnect_C#_APIs.pdf

对于 Uri 路径: /external/Download/How_to_initialize_your_Xamarin_app_to_use_AppConnect_C#_APIs.pdf

【问题讨论】:

    标签: android xamarin uri storage actionview


    【解决方案1】:

    你想达到像下面的GIF这样的效果吗?

    我在下载文件夹中放了一个PDF,我用下面的代码打开它。

      private void Button1_Click(object sender, System.EventArgs e)
            {
    
    
                var storage_path = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath;
    
                var filePathh = Path.Combine(storage_path, "test.pdf");
    
                Java.IO.File file = new Java.IO.File(filePathh);
    
                Intent open = new Intent(Intent.ActionView);
    
                Uri photoURI = FileProvider.GetUriForFile(this, PackageName + ".provider", file);
    
                open.SetDataAndType(photoURI, "application/pdf");
                open.SetFlags(ActivityFlags.NoHistory | ActivityFlags.GrantReadUriPermission);
                Intent intent = Intent.CreateChooser(open, "Open File");
    
                try
                {
                    StartActivity(intent);
                }
                catch (System.Exception)
                {
    
                    throw;
                }
    
            }
    

    请在您的AndroidManifest.xml 中添加provider 并授予读/写权限。

    <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.app17" android:installLocation="auto">
        <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
        <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
    
        <provider
               android:name="android.support.v4.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>
    
      </application>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    </manifest>
    

    在Resource文件夹中创建一个xml文件夹并添加以下provider_paths.xml文件

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

    这是我的演示链接。

    https://github.com/851265601/Xamarin.Android_ListviewSelect/blob/master/App17.zip

    请将 PDF 文件放入下载文件夹,如下图所示。

    【讨论】:

    • FileProvider 和读/写权限已被请求和授予。我们有 provider_paths.xml,它已设置为包含所有可能的文件路径。唯一的区别是我们没有使用 xmlns:android="schemas.android.com/apk/res/android" 我们也遇到了 Uri photoUri 的问题,因为它必须是 Android.Net.Uri 类型的文件,而不是 System.Uri 在运行像你这样的代码之后,随着对 photoUri 类型的更改,我们收到错误“尝试调用虚拟方法 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()”
    • 我更新了我的演示,请看我的回答。您可以下载并测试它。
    • 好的,我们看到了你的演示,非常感谢你,但是你是从 MainActivity.cs 调用这个的,我们通过我们的一个页面调用这个,比如 ListOfAttachments.xaml.cs 调用执行 StartActivity 的类。我们这样做是因为 ListOfAttachments.xaml.cs 继承了 ContentPage 并且没有定义 StartActivity 方法,所以我们调用了一个不同的类来继承 Activity...
    • 如果你使用xamarin表单,你可以使用依赖服务来调用它。 docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/…,如果你想在依赖服务中使用Activity,可以使用Current Activity Plugin 获取github.com/jamesmontemagno/CurrentActivityPlugin
    猜你喜欢
    • 2018-09-10
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2013-09-28
    • 2013-06-13
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多