Xamarin Android App отлично работает на Oreo и более поздних версиях Android, но в противном случае вылетает - PullRequest
0 голосов
/ 21 января 2019

Я вызываю следующую операцию из фрагмента (используя Android.Support.V4.App), чтобы загрузить файл с устройства

    var intent = new Intent();
    intent.SetType("*/*");
    intent.SetAction(Intent.ActionGetContent);
    Activity.StartActivityForResult(Intent.CreateChooser(intent, "Select Files"), 0);

Когда я выбираю файл, код успешно возвращается к

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
       base.OnActivityResult(requestCode, resultCode, data);

       if (resultCode == Result.Ok) // File Attachment
       {
          ICursor returnCursor = ContentResolver.Query(uri, null, null, null, null);
          int nameIndex = returnCursor.GetColumnIndex(OpenableColumns.DisplayName);

          returnCursor.MoveToFirst();

          var fileName = returnCursor.GetString(nameIndex);

          ViewModel.Files.Add(new FileModel()
          {
             FileName = fileName,
             FileBytes = HelperClasses.FileStreamHelper.ReadFully(stream)
          });
       }    
    }

Код успешно завершает метод OnActivityResult, но сразу после этого происходит сбой приложения со следующей ошибкой

--- End of managed Java.Lang.ArrayIndexOutOfBoundsException stack trace ---
java.lang.ArrayIndexOutOfBoundsException: length=8; index=-1
    at java.util.Arrays$ArrayList.get(Arrays.java:3854)
    at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:349)
    at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:405)
    at android.widget.ArrayAdapter.getView(ArrayAdapter.java:371)
    at android.widget.Spinner.makeView(Spinner.java:702)
    at android.widget.Spinner.layout(Spinner.java:650)
    at android.widget.Spinner.onLayout(Spinner.java:612)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.widget.ScrollView.onLayout(ScrollView.java:1535)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1795)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1167)
    at android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:852)
    at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:871)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at com.android.internal.policy.DecorView.onLayout(DecorView.java:724)
    at android.view.View.layout(View.java:17523)
    at android.view.ViewGroup.layout(ViewGroup.java:5612)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2342)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2069)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
    at android.view.Choreographer.doCallbacks(Choreographer.java:683)
    at android.view.Choreographer.doFrame(Choreographer.java:619)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

Обратите внимание, что код работает на Android Oreo и более поздней версии, ноне работает на устройстве Nougat.

1 Ответ

0 голосов
/ 21 января 2019

Я при условии , что вы используете неправильный uri, поскольку он предоставляется через возвращенное намерение.

Примечание. Вам необходимо закрыть и утилизировать ICursor, в противном случае произойдет утечка.

Пример (API с 23 по 28):

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    if (resultCode == Result.Ok && requestCode == 0)
    {
        using (ICursor returnCursor = ContentResolver.Query(data.Data, null, null, null, null))
        {
            switch (returnCursor.Count)
            {
                case 0:
                    Log.Debug("SO", "File not found in media store, media store corruption possible");
                    break;
                case 1:
                    int nameIndex = returnCursor.GetColumnIndex(OpenableColumns.DisplayName);
                    returnCursor.MoveToFirst();
                    var fileName = returnCursor.GetString(nameIndex) ?? "* Name not available *";

                    // Do something with display name
                    Log.Debug("SO", fileName);

                    break;
                default:
                    Log.Debug("SO", "Multiple Files returned, OEM's Intent.CreateChoose allowed mutiple files");
                    break;
            }
            returnCursor.Close();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...