Как получить данные из выбранного файла с помощью Intent.CreateChooser (Intent, «Выбрать любой файл») в качестве байта - PullRequest
0 голосов
/ 14 июня 2019

Я хочу, чтобы при выборе намеренного выбора файлов (apk, exe, pdf, ...) с помощью функции выбора намерений затем извлекать данные, выбрал файл в виде байтового массива в OnActivityResult. У меня много поисков, но я не могу этого сделатьПожалуйста, помогите мне.

Это моя кнопка выбора Код:

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?

1 Ответ

0 голосов
/ 14 июня 2019

Я создал новое приложение и протестировал с pdf и изображением, оно работает правильно. Основной код выглядит следующим образом:

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 и более поздних версиях.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...