相机和图片选择有时会崩溃

时间:2015-06-20 22:22:50

标签: android

我在我的应用程序中插入了一个部分来拍摄和选择照片,但不幸的是,有时,当我拍照或选择要保存在我的服务器上的图片时,应用程序崩溃了。真的很奇怪,因为我的应用程序有时会崩溃。

我收到此错误:

ViewRootImpl #2 Surface is not valid.

如何检查照片是否为空并防止我的应用程序崩溃?

我的代码:

private void selectImage() {

    final CharSequence[] options = {"Take photo","My gallery","Cancel" };

    AlertDialog.Builder builder = new AlertDialog.Builder(PhotosActivity.this);
    builder.setTitle("Adicionar foto!");
    builder.setItems(options, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int item) {
            if (options[item].equals("My gallery"))
            {
                Intent intent = new   Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(intent, 2);

            }
            else if (options[item].equals("Take photo")){
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                File f = new File(android.os.Environment.getExternalStorageDirectory(), "temp.jpg");
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
                startActivityForResult(intent, 1);
            }
            else if (options[item].equals("Cancel")) {
                dialog.dismiss();
            }
        }
    });
    builder.show();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
       if (requestCode == 1) {
           File f = new File(Environment.getExternalStorageDirectory().toString());
           for (File temp : f.listFiles()) {
               if (temp.getName().equals("temp.jpg")) {
                   f = temp;
                   break;
               }
           } 
           try {
               Bitmap bitmap;
               BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();

               bitmap = BitmapFactory.decodeFile(f.getAbsolutePath(),
                       bitmapOptions); 

               if (bitmap.getWidth() > bitmap.getHeight()) {
                   Matrix matrix = new Matrix();
                   matrix.postRotate(getExifOrientation(f.getAbsolutePath()));
                   bitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
               }

               int nh = (int) ( bitmap.getHeight() * (612.0 / bitmap.getWidth()) );
               Bitmap scaled = Bitmap.createScaledBitmap(bitmap, 612, nh, true);

               ByteArrayOutputStream stream = new ByteArrayOutputStream();
               scaled.compress(Bitmap.CompressFormat.JPEG, 90, stream);

               byte [] byte_arr = stream.toByteArray();
               String image_str = Base64.encodeBytes(byte_arr);

               newtask = new saveImage();
               newtask.execute(image_str,sessionid);

               Toast.makeText(getBaseContext(), "A sua imagem estará brevemente disponível.",
               Toast.LENGTH_LONG).show();

               String path = android.os.Environment
                       .getExternalStorageDirectory()
                       + File.separator
                       + "Phoenix" + File.separator + "default";
               f.delete();




               FileOutputStream outFile = null;
               File file = new File(path, String.valueOf(System.currentTimeMillis()) + ".jpg");
               try {
                   outFile = new FileOutputStream(file);
                   bitmap.compress(Bitmap.CompressFormat.JPEG, 85, outFile);
                   outFile.flush();
                   outFile.close();
               } catch (FileNotFoundException e) {
                   e.printStackTrace();
               } catch (IOException e) {
                   e.printStackTrace();
               } catch (Exception e) {
                   e.printStackTrace();
               }
           } catch (Exception e) {
               e.printStackTrace();
           }
       }

       if (requestCode == 2) {

            Uri selectedImage = data.getData();


            String[] filePath = { MediaStore.Images.Media.DATA };
            Cursor c = getContentResolver().query(selectedImage,filePath, null, null, null);
            c.moveToFirst();
            int columnIndex = c.getColumnIndex(filePath[0]);
            String picturePath = c.getString(columnIndex);


            c.close();
            Bitmap thumbnail = (BitmapFactory.decodeFile(picturePath));

            if (thumbnail.getWidth() > thumbnail.getHeight()) {
                Matrix matrix = new Matrix();
                matrix.postRotate(getExifOrientation(picturePath));
                thumbnail = Bitmap.createBitmap(thumbnail , 0, 0, thumbnail.getWidth(), thumbnail.getHeight(), matrix, true);
            }

            int nh = (int) ( thumbnail.getHeight() * (612.0 / thumbnail.getWidth()) );
            Bitmap scaled = Bitmap.createScaledBitmap(thumbnail, 612, nh, true);

            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            scaled.compress(Bitmap.CompressFormat.JPEG, 90, stream);

            byte [] byte_arr = stream.toByteArray();
            String image_str = Base64.encodeBytes(byte_arr);

            if (image_str != null) {
            newtask = new saveImage();
            newtask.execute(image_str,sessionid);
            }


            Toast.makeText(getBaseContext(), "A sua imagem estará brevemente disponível.",
            Toast.LENGTH_LONG).show();

        }
    }
}  

public static int getExifOrientation(String filepath) {
    int degree = 0;
    ExifInterface exif = null;
    try {
        exif = new ExifInterface(filepath);
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    if (exif != null) {
        int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
        if (orientation != -1) {
            switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_90:
                degree = 90;
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                degree = 180;
                break;
            case ExifInterface.ORIENTATION_ROTATE_270:
                degree = 270;
                break;
            }

        }
    }
    return degree;
}

logcat的

  

06-21 15:42:42.890:E / HAWAII_EGL(1795):没有破坏表面   窗口

     

06-21 15:42:49.376:I / dalvikvm(2183):找不到方法   android.content.res.TypedArray.getChangingConfigurations,引用   从方法   android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations

     

06-21 15:42:49.376:I / dalvikvm(2183):找不到方法   android.content.res.TypedArray.getType,从方法引用   android.support.v7.internal.widget.TintTypedArray.getType

0 个答案:

没有答案