2016-08-18 4 views
-1

Я разрабатываю приложение для Android, которое продолжает сбой, когда я нажимаю кнопку, чтобы сделать снимок, который затем должен сохранить изображение в папку и отобразить миниатюру в приложении, однако, как только я сделаю снимок, приложение выйдет из строя, тем не менее сохраняет фотографию в нужную папку. Отображение эскизов работало до того, как я начал внедрять часть сохранения фотографий в приложении.Почему приложение падает, когда я пытаюсь получить данные о намерениях?

Приложение прекращает работу, как только он попадает в этот блок кода (onActivityResult перегруженной функции):

 if(data.getData() == null) { 
      thumbnail.add((Bitmap)data.getExtras().get("data")); 
     } 
     if(thumbnail.get(0) != null && thumbnail.size() > 0) 
     { 
      for(int i=0; i < thumbnail.size();i++){ 
       //Toast.makeText(getApplicationContext(), Integer.toString(thumbnail.size()), Toast.LENGTH_SHORT).show(); 
       createPhotoThumbnail(thumbnail); 
      } 
     } 

Это камера диспетчерская Намерение функция:

private void dispatchCameraIntent(){ 
    Intent takePicIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

    if (takePicIntent.resolveActivity(getPackageManager()) != null) { 
     File photoFile = null; 
     try { 
      photoFile = createImageFile(); 
     } catch (IOException ex) { 
      // Error occurred while creating the Files 
      Toast.makeText(this, "Could not create file", Toast.LENGTH_SHORT).show(); 
     } 
     // Continue only if the File was successfully created 
     if (photoFile != null) { 
      Uri photoURI = Uri.fromFile(photoFile); 

      takePicIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
      takePicIntent.putExtra(android.provider.MediaStore.EXTRA_SIZE_LIMIT, "720000"); 
      startActivityForResult(takePicIntent, REQUEST_IMAGE_CAPTURE); 
      setResult(RESULT_OK, takePicIntent); 
     } 
    } else 
    { 
     //Make a toast if there is no camera app installed. 
     Toast toast = Toast.makeText(this,"No program to take pictures",Toast.LENGTH_SHORT); 
     toast.show(); 
    } 
} 

Я ve добавил логарифм:

FATAL EXCEPTION: main 
Process: lt.vilniausbaldai.vilniausbaldaiofflinedefektai, PID: 14330 
Theme: themes:{} 
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {lt.vilniausbaldai.vilniausbaldaiofflinedefektai/lt.vilniausbaldai.vilniausbaldaiofflinedefektai.MainActivity}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3733) 
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3776) 
    at android.app.ActivityThread.-wrap16(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1412) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5461) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:102) 
    Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
    at java.util.ArrayList.get(ArrayList.java:308) 
    at lt.vilniausbaldai.vilniausbaldaiofflinedefektai.MainActivity.onActivityResult(MainActivity.java:135) 
    at android.app.Activity.dispatchActivityResult(Activity.java:6456) 
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3729) 
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3776)  
    at android.app.ActivityThread.-wrap16(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1412)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:5461)  
    at java.lang.reflect.Method.invoke(Native Method) 

метод createPhotoThumbnail: метод

private void createPhotoThumbnail(ArrayList<Bitmap> thumbnail){ 
    this.imageGrid = (GridView) findViewById(R.id.gridView); 
    this.bitmapList = new ArrayList<>(); 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 

    File file = new File(Environment.getExternalStorageDirectory()+File.separator + "image.jpg"); 

    try { 
     file.createNewFile(); 
     FileOutputStream fo = new FileOutputStream(file); 
     fo.write(bytes.toByteArray()); 
     fo.close(); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try { 
     for(int i = 0; i < thumbnail.size(); i++) { 
      thumbnail.get(i).compress(Bitmap.CompressFormat.JPEG, 100, bytes); 

      this.bitmapList.add(thumbnail.get(i)); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    this.imageGrid.setAdapter(new ImageAdapter(this, this.bitmapList)); 
    imageGrid.invalidate(); 
} 

createImageFile:

private File createImageFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss").format(new Date()); 
    //String timeStamp = "picTesting"; 
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); 

    File image = File.createTempFile(
      timeStamp, /* prefix */ 
      ".png",   /* suffix */ 
      storageDir  /* directory */ 
    ); 

    // Save a file: path for use with ACTION_VIEW intents 
    mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
    //Toast.makeText(this, mCurrentPhotoPath, Toast.LENGTH_LONG).show(); 
    return image; 
} 
+0

пожалуйста, покажите ваш StackTrace –

+0

Вы добавили права доступа? – Alikbar

+0

Да, я добавил android.permission.CAMERA и WRITE_EXTERNAL_STORAGE, я также включил

ответ

0

ошибка встречается, вполне возможно, на этой линии:

if(thumbnail.get(0) != null && thumbnail.size() > 0) 

Это, потому что сначала попробуй получить элемент с индексом 0, после чего вы проверите, есть ли даже некоторые элементы.

Если изменить порядок этих условий, он должен работать нормально:

if(thumbnail.size() > 0 && thumbnail.get(0) != null) 

С этим, вы проверяете первый, если даже есть некоторые элементы, и только если есть, вы пытаетесь получить элемент при индексе 0 и проверьте его, если его null.

+0

К сожалению, это не решило проблему, приложение по-прежнему падает после сохранения фотографии. Он также выходит из строя, если он проходит через это, если: «if (data.getData() == null) {« –

+0

Вы получили тот же самый логарифм, что и раньше? – Bobby

+0

Логарифм идентичен, я даже попробовал оба снова, чтобы убедиться. –

0

Попробуйте это:

if(data != null){  
     Bundle extras = data.getExtras(); 
if (requestCode == REQUEST_IMAGE_CAPTURE && resultcode == RESULT_OK){ 

      if (extras.containsKey("data")) { 
        bitmap = (Bitmap) extras.get("data"); 
        thumbnail.add(bitmap); 
       } 
       if(thumbnail.get(0) != null && thumbnail.size() > 0) 
       { 
        for(int i=0; i < thumbnail.size();i++){ 
         //Toast.makeText(getApplicationContext(), Integer.toString(thumbnail.size()), Toast.LENGTH_SHORT).show(); 
         createPhotoThumbnail(thumbnail); 
        } 
       } 
    } 
} 
+0

К сожалению, не работает, вот мой logcat: http://pastebin.com/wrdGm0nZ –

+0

Попробуйте обновленный ответ – Jas

+0

Это похоже на предотвращение сбоя приложения , фото по-прежнему сохраняется, однако весь блок кода, который добавляет миниатюру, никогда не запускается, приложение никогда не пройдет "if (data! = null) {" –

Смежные вопросы