如何使用 Intent.CreateChooser(Intent, “Select Any File") 作为字节从所选文件中获取数据 [英] how ca in get data from choosed file with Intent.CreateChooser(Intent, "Select Any File") as byte

查看:16
本文介绍了如何使用 Intent.CreateChooser(Intent, “Select Any File") 作为字节从所选文件中获取数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在使用意向选择器选择非类型文件(apk、exe、pdf、...)然后提取数据时,在 OnActivityResult 中选择文件作为字节数组我有很多搜索,但我不能这样做,请帮帮我.

I want when choosing non-type files(apk, exe, pdf, ...) with intent chooser then extract data chose the file as a byte array in OnActivityResult I have a lot of searches but I can't do this, please help me.

这是我的选择按钮代码:

This is my pick button Code:

private void Pick_Click(object sender, EventArgs e)
{
    Intent = new Intent();
    Intent.SetType("*/*");
    Intent.SetAction(Intent.ActionGetContent);

    Intent chooser = Intent.CreateChooser(Intent, "Select  Any File");

    StartActivityForResult(chooser, 1);
}

现在如何在OnActivityResult中获取所选文件?

Now how can I get the choosed file in OnActivityResult?

推荐答案

我创建了一个新的应用程序并使用 pdf 和图像进行测试,它可以正常工作.主要代码如下:

I have created a new app and test with pdf and image, it works properly. The main code is as follows:

static readonly int REQUEST_CHOOSER = 0x001;
static readonly int REQUEST_File = 0x002;

Intent intent = new Intent(Intent.ActionGetContent);
intent.SetType("*/*");
intent.AddCategory(Intent.CategoryOpenable);
StartActivityForResult(Intent.CreateChooser(intent, "Select ,Music"), REQUEST_CHOOSER);

方法 OnActivityResult

 protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
            if (resultCode == Result.Canceled)
            {
                Finish();
            }
            else
            {
                try
                {
                var _uri = data.Data;
                var filePath = IOUtil.getPath(this, _uri);

                if (string.IsNullOrEmpty(filePath))
                    filePath = _uri.Path;

                var file = IOUtil.readFile(filePath);// here we can get byte array
            }
                catch (Exception readEx)
                {
                    System.Diagnostics.Debug.Write(readEx);
                }
                finally
                {
                    Finish();
                }
        }
    }

IOUtil.cs

public class IOUtil
{
    public static string getPath(Context context, Android.Net.Uri uri)
    {
        bool isKitKat = Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat;

        // DocumentProvider
        if (isKitKat && DocumentsContract.IsDocumentUri(context, uri))
        {
            // ExternalStorageProvider
            if (isExternalStorageDocument(uri))
            {
                var docId = DocumentsContract.GetDocumentId(uri);
                string[] split = docId.Split(':');
                var type = split[0];

                if ("primary".Equals(type, StringComparison.OrdinalIgnoreCase))
                {
                    return Android.OS.Environment.ExternalStorageDirectory + "/" + split[1];
                }

                // TODO handle non-primary volumes
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri))
            {

                string id = DocumentsContract.GetDocumentId(uri);
                Android.Net.Uri contentUri = ContentUris.WithAppendedId(
                        Android.Net.Uri.Parse("content://downloads/public_downloads"), long.Parse(id));

                return getDataColumn(context, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri))
            {
                var docId = DocumentsContract.GetDocumentId(uri);
                string[] split = docId.Split(':');
                var type = split[0];

                Android.Net.Uri contentUri = null;
                if ("image".Equals(type))
                {
                    contentUri = MediaStore.Images.Media.ExternalContentUri;
                }
                else if ("video".Equals(type))
                {
                    contentUri = MediaStore.Video.Media.ExternalContentUri;
                }
                else if ("audio".Equals(type))
                {
                    contentUri = MediaStore.Audio.Media.ExternalContentUri;
                }

                var selection = "_id=?";
                var selectionArgs = new string[] {
                    split[1]
                };

                return getDataColumn(context, contentUri, selection, selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".Equals(uri.Scheme, StringComparison.OrdinalIgnoreCase))
        {
            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".Equals(uri.Scheme, StringComparison.OrdinalIgnoreCase))
        {
            return uri.Path;
        }

        return null;
    }

    public static string getDataColumn(Context context, Android.Net.Uri uri, string selection,
    string[] selectionArgs)
    {

        ICursor cursor = null;
        var column = "_data";
        string[] projection = {
            column
        };

        try
        {
            cursor = context.ContentResolver.Query(uri, projection, selection, selectionArgs,
                    null);
            if (cursor != null && cursor.MoveToFirst())
            {
                int column_index = cursor.GetColumnIndexOrThrow(column);
                return cursor.GetString(column_index);
            }
        }
        finally
        {
            if (cursor != null)
                cursor.Close();
        }
        return null;
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    public static bool isExternalStorageDocument(Android.Net.Uri uri)
    {
        return "com.android.externalstorage.documents".Equals(uri.Authority);
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    public static bool isDownloadsDocument(Android.Net.Uri uri)
    {
        return "com.android.providers.downloads.documents".Equals(uri.Authority);
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    public static bool isMediaDocument(Android.Net.Uri uri)
    {
        return "com.android.providers.media.documents".Equals(uri.Authority);
    }

    public static byte[] readFile(string file)
    {
        try
        {
            return readFile(new File(file));
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.Write(ex);
            return new byte[0];
        }
    }

    public static byte[] readFile(File file)
    {
        // Open file
        var f = new RandomAccessFile(file, "r");

        try
        {
            // Get and check length
            long longlength = f.Length();
            var length = (int)longlength;

            if (length != longlength)
                throw new IOException("Filesize exceeds allowed size");
            // Read file and return data
            byte[] data = new byte[length];
            f.ReadFully(data);
            return data;
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.Write(ex);
            return new byte[0];
        }
        finally
        {
            f.Close();
        }
    }
}

注意:需要在AndroidManifest文件中添加权限,Android M及以上版本需要添加运行时权限.

Note: you need to add permission in AndroidManifest file, and add Runtime Permisssion in Android M and above.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

这篇关于如何使用 Intent.CreateChooser(Intent, “Select Any File") 作为字节从所选文件中获取数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆