2013-09-27 49 views
21

Tôi thực sự thất vọng để giải quyết vấn đề của mình, tôi có một ứng dụng sử dụng camera, khi camera chụp ảnh, nó sẽ hiển thị trên hoạt động, khi tôi không sử dụng ảnh cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri); sẽ hiển thị trên hoạt động, nhưng tên và tệp đường dẫn không giống như những gì tôi muốn. Tôi đang sử dụng galaxy tab để biên dịch nó, tôi có làm theo hướng dẫn để giải quyết vấn đề của tôi từ here, herehere nhưng ứng dụng của tôi vẫn buộc chặt chẽ và eror, đây là mã của tôi:android camera: Không cung cấp kết quả ResultInfo {who = null, request = 0, result = -1, data = null} đến hoạt động

{ 

       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); 

      } 

phương pháp 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); 
     } 

đây là logcat của tôi nói:

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 

tôi thực sự hy vọng ai đó có thể giúp tôi giải quyết vấn đề của tôi, tôi đã s tack và không thể suy nghĩ anyway một lần nữa, xin vui lòng ai đó giúp tôi ... cảm ơn bạn.

+0

Đây chỉ là ngoại lệ con trỏ rỗng, dòng FormSpaj.java:993 là gì? –

+0

Ảnh bitmap = (Bitmap) data.getExtras(). Get ("dữ liệu"); –

+0

'getExtras()' có thể trả về null nếu không có gói phụ. Bạn nên chắc chắn rằng giá trị trả về từ 'getExtras()' không phải là 'null'. – jedwards

Trả lời

20

Hãy thử điều này đang làm việc như quyến rũ với tôi

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

cảm ơn sự giúp đỡ của bạn ... nhưng tôi có một câu hỏi, tại sao khi tôi chụp một hình ảnh khác, đây không phải là viết lại hình ảnh đã tạo trước đó? –

+0

vì chúng tôi tạo ra uri duy nhất trong phương thức setImageUri() bằng cách thêm mili giây thời gian hiện tại. Nếu bạn muốn ghi đè tệp, hãy cung cấp tên tệp được mã hóa tĩnh trong phương thức setImageUri(). –

+0

tôi đã thực hiện như sau: File file = new File (Environment.getExternalStorageDirectory() + "/ android/data/spaj_foto/spaj_foto.png"); Uri imgUri = Uri.fromFile (tệp); this.imgPath = file.getAbsolutePath(); –

6

Hãy thử điều này, Hôm qua tôi đã có cùng một vấn đề. bằng cách sử dụng mã dưới đây tôi khắc phục vấn đề. hãy thử nó.

Lưu ý: Và cũng thêm configChanges cho hoạt động cụ thể. trong khi gọi hoạt động của máy ảnh sẽ được làm mới. bạn cần phải tránh điều đó. 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

Nhiều mã sạch hơn, có thể giúp ai đó tìm kiếm câu trả lời, về cơ bản khi bạn lưu tập tin để bó lưu trữ bên ngoài không có bitmap trong kết quả, thay vào đó bạn phải tải từ tập tin

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

Điều này đã giúp. Cảm ơn bạn! Tôi vẫn đang cố gắng 'Bitmap picture = (Bitmap) data.getExtras(). Get (" data ");' – RichArt

2

tôi nghĩ rằng dòng sau gây ra vấn đề.

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

Bạn vượt qua các tập tin uri đã như sau

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri); 

Khi bạn vượt qua EXTRA_OUTPUT với một URI, mục đích bạn nhận được trong onActivityResult() sẽ được null. Nếu bạn muốn lấy hình ảnh trong phương thức này, hãy tìm nạp hình ảnh với đường dẫn bạn vượt qua bằng EXTRA_OUTPUT.

+0

Điều này thực sự hiệu quả. Tôi bắt đầu gặp phải vấn đề về sự cố trên Android 7.0 và việc xóa bỏ dòng này đã thực hiện thủ thuật. Ngoài ra, loại bỏ dòng này cũng không ảnh hưởng đến các thiết bị khó tính trước. Được thử nghiệm từ Android 4.4 trở lên. –

Các vấn đề liên quan