#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];
. Вы уверены, что у вас здесь два предмета?