使用Xamarin Android打开自定义文件时的文件扩展名

时间:2017-09-12 01:12:15

标签: android-intent xamarin xamarin.android

我试图在我的Xamarin Android应用中打开自定义文件,但是当我打开它时,我无法正确获取文件扩展名,甚至无法获取文件名。我尝试使用OneDrive,它可以正常工作但不适用于Google云端硬盘甚至是下载应用。

这是我的AndroidManifest:

<application android:allowTaskReparenting="true" ...>
    <activity android:launchMode="singleTask" ...>          
        <intent-filter android:autoVerify="true">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="content" android:mimeType="application/octet-stream" android:pathPattern=".*\\.pec" />
            <data android:scheme="content" android:mimeType="application/*" android:pathPattern=".*\\.pec" />
            <data android:scheme="content" android:mimeType="*/*" android:pathPattern=".*\\.pec" />
        </intent-filter>
        ...
    </activity>
</application>

我在OnNewIntent方法中得到了Intent,因为我使用SingleTask作为LaunchMode。所以我的代码就是这样:

protected override void OnNewIntent(Intent intent)
{
   string action = intent.Action;
   string type = intent.Type; 
   AN.Uri fileUri = intent.Data; 
   string filename = fileUri.LastPathSegment; 
}

这就是我作为fileUri和文件名获得的。

  • 来自OneDrive: 内容://com.microsoft.skydrive.content.external/Drive/ID/1/Item/RID/8E63BB6D425F77DA%217395/Stream/1/Property/kn.pec

  • 来自Google云端硬盘: 内容://com.google.android.apps.docs.storage.legacy/enc%3DLU5kldI4Leii_fQEr6niunAH6hjV_WGJrQZDf64TSRRqnyqi

  • 来自下载: 内容://com.android.providers.downloads.documents/document/4169

1 个答案:

答案 0 :(得分:0)

这就是我能够从Android上的下载和Google驱动器获取文件名的方法:

internal static bool TryGetFileNameFromUri(Android.Net.Uri uri, out string displayName)
{
    var result = false;
    displayName = default;

    var resolver = MainActivity.Instance.ContentResolver;

    if (uri.ToString().StartsWith("content://"))
    {
        Android.Database.ICursor cursor = null;
        try
        {
            cursor = resolver.Query(uri, null, null, null, null);
            if (cursor != null && cursor.MoveToFirst())
            {
                displayName = cursor.GetString(cursor.GetColumnIndex(OpenableColumns.DisplayName));
                result = true;
            }
        }
        finally
        {
            cursor.Close();
        }
    }

    return result;
}