2013-09-27 86 views
21

我真的很沮丧解决我的问题,我有一个应用程序,使用相机,当相机捕获一张照片,它将显示在活动上,当我不使用时cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);照片将显示在活动上,但名称和路径文件不像我想要的那样。我使用的Galaxy Tab编译它,我必须跟着教程来解决我的问题,从hereherehere但我的应用程序仍然强制关闭和eror,这是我的代码:安卓相机:失败的结果ResultInfo {谁=空,请求= 0,结果= -1,数据=空}到活动

{ 

       File sdCard= Environment.getExternalStorageDirectory(); 
       File path = new File (sdCard.getAbsolutePath() + "/android/data/spaj_foto"); 
       path.mkdir(); 
       File file= new File (path,"spaj_foto.png"); 
       String filePath ="/android/data/spaj_foto/spaj_foto.png"; 

        try { 
         file.createNewFile(); 
        } catch (IOException e) {}  


       mPhotoUri = Uri.fromFile(file); 
       values.put(MediaStore.Images.ImageColumns.DATA, file.getPath()); 
       mPhotoUri=getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 

        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri); 
        startActivityForResult(cameraIntent,TAKE_PHOTO_CODE); 

      } 

activityresult方法:

@Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) { 
       Bitmap photo = (Bitmap) data.getExtras().get("data"); 
       image_spaj.setImageBitmap(photo); 


       // CALL THIS METHOD TO GET THE URI FROM THE BITMAP 
       Uri tempUri = getImageUri(getApplicationContext(), photo); 

       // CALL THIS METHOD TO GET THE ACTUAL PATH 
       File finalFile = new File(getRealPathFromURI(tempUri)); 

//    System.out.println(mImageCaptureUri); 
      } 
     } 
     public String getRealPathFromURI(Uri mPhotoUri) { 
      Cursor cursor = getContentResolver().query(mPhotoUri, null, null, null, null); 
      cursor.moveToFirst(); 
      int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
      return cursor.getString(idx); 
     } 

     public Uri getImageUri(Context inContext, Bitmap inImage) { 
      ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
      inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
      String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); 
      return Uri.parse(path); 
     } 

这是我的logcat说:

09-27 10:59:43.186: E/AndroidRuntime(31318): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity {org.example.touch/org.example.touch.FormSpaj}: java.lang.NullPointerException 
09-27 10:59:43.186: E/AndroidRuntime(31318): at android.app.ActivityThread.deliverResults(ActivityThread.java:3179) 
09-27 10:59:43.186: E/AndroidRuntime(31318): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3222) 
09-27 10:59:43.186: E/AndroidRuntime(31318): at android.app.ActivityThread.access$1100(ActivityThread.java:140) 
09-27 10:59:43.186: E/AndroidRuntime(31318): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1276) 
09-27 10:59:43.186: E/AndroidRuntime(31318): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-27 10:59:43.186: E/AndroidRuntime(31318): at android.os.Looper.loop(Looper.java:137) 
09-27 10:59:43.186: E/AndroidRuntime(31318): at android.app.ActivityThread.main(ActivityThread.java:4895) 
09-27 10:59:43.186: E/AndroidRuntime(31318): at java.lang.reflect.Method.invokeNative(Native Method) 
09-27 10:59:43.186: E/AndroidRuntime(31318): at java.lang.reflect.Method.invoke(Method.java:511) 
09-27 10:59:43.186: E/AndroidRuntime(31318): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 
09-27 10:59:43.186: E/AndroidRuntime(31318): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 
09-27 10:59:43.186: E/AndroidRuntime(31318): at dalvik.system.NativeStart.main(Native Method) 
09-27 10:59:43.186: E/AndroidRuntime(31318): Caused by: java.lang.NullPointerException 
09-27 10:59:43.186: E/AndroidRuntime(31318): at org.example.touch.FormSpaj.onActivityResult(FormSpaj.java:993) 
09-27 10:59:43.186: E/AndroidRuntime(31318): at android.app.Activity.dispatchActivityResult(Activity.java:5347) 
09-27 10:59:43.186: E/AndroidRuntime(31318): at android.app.ActivityThread.deliverResults(ActivityThread.java:3175) 
09-27 10:59:43.186: E/AndroidRuntime(31318): ... 11 more 

我真的希望有人能帮助我解决我的问题,我已经ş大头贴,不能再反思了,请别人帮我......谢谢。

+0

这只是一个空指针异常,FormSpaj.java:993是什么? –

+0

位图photo =(位图)data.getExtras()。get(“data”); –

+0

'getExtras()'可以返回null,如果没有额外的Bundle。你应该确保'getExtras()'返回的值不是'null'。 – jedwards

回答

20

试试这个工作一样的魅力与我

private String selectedImagePath = ""; 
    final private int PICK_IMAGE = 1; 
    final private int CAPTURE_IMAGE = 2; 

public Uri setImageUri() { 
     // Store image in dcim 
     File file = new File(Environment.getExternalStorageDirectory() + "/DCIM/", "image" + new Date().getTime() + ".png"); 
     Uri imgUri = Uri.fromFile(file); 
     this.imgPath = file.getAbsolutePath(); 
     return imgUri; 
    } 


    public String getImagePath() { 
     return imgPath; 
    } 

btnGallery.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(); 
       intent.setType("image/*"); 
       intent.setAction(Intent.ACTION_GET_CONTENT); 
       startActivityForResult(Intent.createChooser(intent, ""), PICK_IMAGE); 

      } 
     }); 

     btnCapture.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       intent.putExtra(MediaStore.EXTRA_OUTPUT, setImageUri()); 
       startActivityForResult(intent, CAPTURE_IMAGE); 
      } 
     }); 

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode != Activity.RESULT_CANCELED) { 
      if (requestCode == PICK_IMAGE) { 
       selectedImagePath = getAbsolutePath(data.getData()); 
       imgUser.setImageBitmap(decodeFile(selectedImagePath)); 
      } else if (requestCode == CAPTURE_IMAGE) { 
       selectedImagePath = getImagePath(); 
       imgUser.setImageBitmap(decodeFile(selectedImagePath)); 
      } else { 
       super.onActivityResult(requestCode, resultCode, data); 
      } 
     } 

    } 


public Bitmap decodeFile(String path) { 
     try { 
      // Decode image size 
      BitmapFactory.Options o = new BitmapFactory.Options(); 
      o.inJustDecodeBounds = true; 
      BitmapFactory.decodeFile(path, o); 
      // The new size we want to scale to 
      final int REQUIRED_SIZE = 70; 

      // Find the correct scale value. It should be the power of 2. 
      int scale = 1; 
      while (o.outWidth/scale/2 >= REQUIRED_SIZE && o.outHeight/scale/2 >= REQUIRED_SIZE) 
       scale *= 2; 

      // Decode with inSampleSize 
      BitmapFactory.Options o2 = new BitmapFactory.Options(); 
      o2.inSampleSize = scale; 
      return BitmapFactory.decodeFile(path, o2); 
     } catch (Throwable e) { 
      e.printStackTrace(); 
     } 
     return null; 

    } 

public String getAbsolutePath(Uri uri) { 
     String[] projection = { MediaColumns.DATA }; 
     @SuppressWarnings("deprecation") 
     Cursor cursor = managedQuery(uri, projection, null, null, null); 
     if (cursor != null) { 
      int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA); 
      cursor.moveToFirst(); 
      return cursor.getString(column_index); 
     } else 
      return null; 
    } 
+0

谢谢你的帮助......但我有一个问题,为什么当我捕捉另一个图像时,这不是重写之前创建的图像? –

+0

,因为我们通过追加当前时间毫秒来在此方法setImageUri()中生成唯一的uri。如果要在setImageUri()方法中覆盖该文件,请提供静态硬编码文件名。 –

+0

我这样做了:File file = new File(Environment.getExternalStorageDirectory()+“/ android/data/spaj_foto/spaj_foto.png”); Uri imgUri = Uri.fromFile(file); this.imgPath = file.getAbsolutePath(); –

6

试试这个,昨天我有同样的问题。使用下面的代码我纠正了问题。试试吧。

注意:并且还为特定活动添加configChanges。同时调用相机意图活动将被刷新。你需要避免这种情况。 android:configChanges="orientation|keyboardHidden|screenSize"

btnGallery.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      intent = new Intent(Intent.ACTION_PICK); 
          intent.setType("image/*"); 
          startActivityForResult(intent, 1); 
     } 
    }); 

    btnCapture.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(
            MediaStore.ACTION_IMAGE_CAPTURE); 
          File file = new File(Environment 
            .getExternalStorageDirectory(), 
            "test.jpg"); 

          outputFileUri = Uri.fromFile(file); 
          Log.d("TAG", "outputFileUri intent" 
            + outputFileUri); 
          intent.putExtra(MediaStore.EXTRA_OUTPUT, 
            outputFileUri); 
          startActivityForResult(intent, 0); 
     } 
    }); 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 

    switch (requestCode) { 
    case 0: 
     if (resultCode == RESULT_OK) { 
      Log.d("TAG", "outputFileUri RESULT_OK" + outputFileUri); 
      if (outputFileUri != null) { 

       Bitmap bitmap; 
       bitmap = decodeSampledBitmapFromUri(outputFileUri, 
         image.getWidth(), image.getHeight()); 

       if (bitmap == null) { 
        Toast.makeText(getApplicationContext(), 
          "the image data could not be decoded", 
          Toast.LENGTH_LONG).show(); 

       } else { 
        Toast.makeText(
          getApplicationContext(), 
          "Decoded Bitmap: " + bitmap.getWidth() + " x " 
            + bitmap.getHeight(), Toast.LENGTH_LONG) 
          .show(); 
        image.setImageBitmap(bitmap); 
       } 
      } 
     } 
     break; 
    case 1: 
     if (resultCode == RESULT_OK) { 
      Uri targetUri = data.getData(); 
      Log.d("TAG", "datae" + targetUri); 
      Bitmap bitmap; 
      bitmap = decodeSampledBitmapFromUri(targetUri, 
        image.getWidth(), image.getHeight()); 

      if (bitmap == null) { 
       Toast.makeText(getApplicationContext(), 
         "the image data could not be decoded", 
         Toast.LENGTH_LONG).show(); 

      } else { 
       Toast.makeText(
         getApplicationContext(), 
         "Decoded Bitmap: " + bitmap.getWidth() + " x " 
           + bitmap.getHeight(), Toast.LENGTH_LONG) 
         .show(); 
       image.setImageBitmap(bitmap); 
      } 
     } 
     break; 

    default: 
     break; 
    } 
} 

public Bitmap decodeSampledBitmapFromUri(Uri uri, int reqWidth, 
     int reqHeight) { 

    Bitmap bm = null; 

    try { 
     // First decode with inJustDecodeBounds=true to check dimensions 
     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(getContentResolver() 
       .openInputStream(uri), null, options); 

     // Calculate inSampleSize 
     options.inSampleSize = calculateInSampleSize(options, reqWidth, 
       reqHeight); 

     // Decode bitmap with inSampleSize set 
     options.inJustDecodeBounds = false; 
     bm = BitmapFactory.decodeStream(getContentResolver() 
       .openInputStream(uri), null, options); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     Toast.makeText(getApplicationContext(), e.toString(), 
       Toast.LENGTH_LONG).show(); 
    } 

    return bm; 
} 

public int calculateInSampleSize(BitmapFactory.Options options, 
     int reqWidth, int reqHeight) { 
    // Raw height and width of image 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 
     if (width > height) { 
      inSampleSize = Math.round((float) height/(float) reqHeight); 
     } else { 
      inSampleSize = Math.round((float) width/(float) reqWidth); 
     } 
    } 
    return inSampleSize; 
} 
3

更清晰的代码,可以帮助别人寻找答案,基本上当你保存文件到外部存储捆绑包不再有结果的位图,而不是你必须从文件

String fileName; 
. 
. 
private void takePicture() { 
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    // Ensure that there's a camera activity to handle the intent 
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
     // Create the File where the photo should go 
     File photoFile = null; 
     try { 
      photoFile = createImageFile(); 
     } catch (IOException ex) { 
      // Error occurred while creating the File 

     } 
     // Continue only if the File was successfully created 
     if (photoFile != null) { 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, 
        Uri.fromFile(photoFile)); 
      startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); 
     } 
    } 
} 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data)  { 
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 

     loadImageFromFile(); 
    } 
} 
public void loadImageFromFile(){ 

    ImageView view = (ImageView)this.findViewById(R.id.imageViewHeader); 
    view.setVisibility(View.VISIBLE); 


    int targetW = view.getWidth(); 
    int targetH = view.getHeight(); 

    // Get the dimensions of the bitmap 
    BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
    bmOptions.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(fileName, bmOptions); 
    int photoW = bmOptions.outWidth; 
    int photoH = bmOptions.outHeight; 

    // Determine how much to scale down the image 
    int scaleFactor = Math.min(photoW/targetW, photoH/targetH); 

    // Decode the image file into a Bitmap sized to fill the View 
    bmOptions.inJustDecodeBounds = false; 
    bmOptions.inSampleSize = scaleFactor; 
    bmOptions.inPurgeable = true; 

    Bitmap bitmap = BitmapFactory.decodeFile(fileName, bmOptions); 
    view.setImageBitmap(bitmap); 
} 
private File createImageFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES); 
    File image = File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
    ); 

    // Save a file: path for use with ACTION_VIEW intents 
    fileName = image.getAbsolutePath(); 
    return image; 
} 
+0

这有帮助。谢谢!我仍然试图'位图图片=(位图)data.getExtras()。获得(“数据”);' – RichArt

2

我加载认为以下行导致问题。

Bitmap photo = (Bitmap) data.getExtras().get("data"); 

你已经通过的文件URI如下

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri); 

当您通过EXTRA_OUTPUT一个URI,你在onActivityResult接收(意图)将是无效的。如果您想以此方法获取图像,请使用EXTRA_OUTPUT传递的路径获取图像。

+0

这真的有效。我开始面对Android 7.0的崩溃问题,并删除这条线没有办法。此外,删除这条线也不会影响牛轧糖前的设备。从Android 4.4及以上版本进行测试。 –

相关问题