Приложение выходит из строя, когда я выбираю изображение из галереи

#java #android #arrays

Вопрос:

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

Сообщение об ошибке

 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=10, result=-1, data=Intent { dat=content://com.android.providers.downloads.documents/document/18 flg=0x1 }} to activity {com.tymo.meinkochbuch/com.tymo.meinkochbuch.AddNewRecipe}: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1  at android.app.ActivityThread.deliverResults(ActivityThread.java:4360)  at android.app.ActivityThread.handleSendResult(ActivityThread.java:4402)  at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loop(Looper.java:193)  at android.app.ActivityThread.main(ActivityThread.java:6669)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)  

Код RealPathUtil

 public static String getRealPathFromURI_API19(Context context, Uri uri) {  String filePath = "";  String wholeID = DocumentsContract.getDocumentId(uri);   // Split at colon, use second item in the array  String id = wholeID.split(":")[1];   String[] column = {MediaStore.Images.Media.DATA};   // where id is equal to  String sel = MediaStore.Images.Media._ID   "=?";   Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,  column, sel, new String[]{id}, null);   int columnIndex = cursor.getColumnIndex(column[0]);   if (cursor.moveToFirst()) {  filePath = cursor.getString(columnIndex);  }  cursor.close();  return filePath;  }  

Код для активностирезультат

 @Override  protected void onActivityResult(int requestCode, int resultCode, Intent data) {  super.onActivityResult(requestCode, resultCode, data);  switch (requestCode) {  case REQUEST_OPEN_GALLERY:  switch (resultCode) {  case RESULT_OK:  if (data.getData() != null){   Uri imageData = data.getData();  String imageSrc = Files.getRealPathFromURI(this, imageData);  ((AddRecipeOne) getSupportFragmentManager().findFragmentById(R.id.frame_container))  .onImageSelected(imageSrc);  currentRecipe.setImagePath(imageSrc);  }  break;  }  }  }  

Комментарии:

1. Удалить getRealPathFromURI() . Используйте библиотеку загрузки изображений (Glide, Picasso и т. Д.) Для загрузки содержимого из Uri в ImageView .

Ответ №1:

Я вижу, что вы используете этот код для загрузки выбранного изображения в изображение view.So,вместо того,чтобы использовать оооочень много строк кода, вы можете просто сделать это

 currentRecipe.setImageUri(data.getData());  

как data.getData() uri retursn,он установит изображение на это, и это также оптимизирует код.Вы можете использовать это, чтобы это делалось еще быстрее.

Использование Glide, как упоминалось @CommonsWare, также займет около 1 или 2 секунд, пока он будет искать файл, а затем загружаться.Так что используйте currentRecipe.setImageUri(data.getData()); .

Ответ №2:

Причина аварии, по-видимому, довольно хорошо объяснена в отношении AddNewRecipe :

 java.lang.ArrayIndexOutOfBoundsException: length=1; index=1  

Вы не можете иметь индекс 1 в массиве длиной 1, так как существует только индекс 0.

Комментарии:

1. @ТимоС. Я не уверен, что весь код, который у вас есть, присутствует в сообщении. Самый простой способ-найти номер строки и поставить точку останова для ее отладки. Где-то вы пытаетесь заполнить или получить индекс массива, который выходит за рамки.

2. Например, я вижу, что вы используете String id = wholeID.split(":")[1]; . Вы уверены, что у вас здесь два предмета?