2017-12-07 7 views
0

카메라의 이미지를 7.0 장치에서 잘라내려고합니다. 나는 안드로이드 인 텐트를 사용하여 자르기 함수를 작성하고 FileUriExposedException을 피하기 위해 파일 제공자를 통해 내 파일을 노출했습니다.카메라 동작 - 잘리지 않는 누더기

문제는 카메라를 열고 자르기 도구가 나타나지 않고 내 이미지보기에 아무 것도 표시되지 않는 것입니다. 여기

private void cropImage() { 

    try { 
     Intent cropIntent = new Intent("com.android.camera.action.CROP"); 
     cropIntent.setDataAndType(uri, "image/*"); 
     cropIntent.putExtra("crop", "true"); 
     cropIntent.putExtra("outputX", 200); 
     cropIntent.putExtra("outputY", 200); 
     cropIntent.putExtra("aspectX", 1); 
     cropIntent.putExtra("aspectY", 1); 
     cropIntent.putExtra("scale", true); 
     cropIntent.putExtra("return-data", true); 

     startActivityForResult(cropIntent, CROP_CODE); 
    } catch (ActivityNotFoundException aex) { 
     aex.printStackTrace(); 
     Toast.makeText(this, "Current Device Has No Crop Support", Toast.LENGTH_LONG).show(); 
    } 

} 

내 카메라 의도 코드 :

가 여기 내 작물 기능 코드의 내가 카메라 비트 맵에서 직접 이미지 뷰를 설정하려고하면

private void photoDialog() { 
    final CharSequence[] imgOptions = {"Take Photo", "Select from Gallery"}; 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle("Choose Image Options"); 
    builder.setItems(imgOptions, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialogInterface, int i) { 
      if (imgOptions[i].equals("Take Photo")) { 
       try { 
        Intent camIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

        file = new File(Environment.getExternalStorageDirectory(), "tmp_" + String.valueOf(System.currentTimeMillis())); 
        Log.d("MainActivity", "File Saved in:\t" + file.getAbsolutePath().toString()); 

        if (Build.VERSION.SDK_INT > 23) { 
         uri = FileProvider.getUriForFile(MainActivity.this, getString(R.string.file_prov_authority), file); 
        } else { 
         uri = Uri.fromFile(file); 
        } 

        camIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri); 
        camIntent.putExtra("return-data", "true"); 
        startActivityForResult(camIntent, CAM_CODE); 

       } catch (ActivityNotFoundException ex) { 
        ex.printStackTrace(); 
       } 
      } else if (imgOptions[i].equals("Select from Gallery")) { 
       Intent galIntent = new Intent(Intent.ACTION_GET_CONTENT, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       startActivityForResult(Intent.createChooser(galIntent, "Open With"), GAL_CODE); 
      } 
     } 
    }); 

, 나도이 예외를 얻을 :

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String)' on a null object reference 

내 활동 결과 코드 :

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == CAM_CODE && resultCode == RESULT_OK) { 
     Bitmap bitmap = (Bitmap) data.getExtras().get("data"); 
     img_camera.setImageBitmap(bitmap); 
     cropImage(); 
    } 

    else if (requestCode == GAL_CODE && resultCode == RESULT_OK) { 
     if (data != null) { 
      uri = data.getData(); 
      img_camera.setImageURI(uri); 
      cropImage(); 
     } 
    } 

    else if (requestCode == CROP_CODE) { 
     Bundle photo_extras = data.getExtras(); 
     Bitmap bitmap = photo_extras.getParcelable("data"); 

     img_camera.setImageBitmap(bitmap); 

    } 

} 

갤러리 코드의 자르기는 동일한 기능이지만 완벽하게 작동합니다.

모든 블로그와 YT 비디오를 크롤링하고 Ntn이 지금까지 작동 했으므로 누군가 Nougat 기기에서 카메라 이미지 자르기를 도와 줄 수 있습니까? 감사.

+0

(https://commonsware.com/blog/2013/01/23/no-android-does-not-have- [안드로이드는'CROP'을'Intent'이 없습니다] crop-intent.html). 많은 [안드로이드에서 사용할 수있는 이미지 자르기 라이브러리] (https://android-arsenal.com/tag/45?sort=created)가 있습니다. 하나를 사용하십시오. – CommonsWare

+0

@CommonsWare, 아서 허브 라이브러리에서 카메라 이미지를 자르는 방법을 알려주시겠습니까? 고마워요 –

+0

그 라이브러리를 사용하지 않았습니다. 질문이있는 경우 도서관 개발자가 제공하는 지원 옵션을 확인하십시오. – CommonsWare

답변

0

당신의 문제는 이미지의 이름에 있다고 생각합니다.

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

변경 그것에 :이 라인에서 올

file = new File(Environment.getExternalStorageDirectory(), "tmp_" + String.valueOf(System.currentTimeMillis()) + ".jpg"); 

그리고 당신의 오류 예외 : 같은 .JPG으로 이름을 시도 작동하지 않다면

Bundle bundle = data.getExtras(); 
Bitmap bitmap = bundle.getParcelable("data"); 

, 시도 내 코드 (그것은 저에게 효과적입니다.) 또한

//Define constants: 
private static final int PERMISSION_CAMERA_CODE = 1; 
private static final int PERMISSION_STORE_CODE = 2; 
private static final int REQUEST_CODE_TAKE_IMAGE = 3; 
private static final int REQUEST_CODE_CHOOSE_IMAGE = 4; 
private static final int REQUEST_CODE_CROP_AVATAR = 5; 
private static final int REQUEST_CODE_CROP_COVER = 6; 


private void openCamera() { 

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    intent.putExtra("android.intent.extras.CAMERA_FACING", 1); 

    file = new File(Environment.getExternalStorageDirectory(), "file" + String.valueOf(System.currentTimeMillis()) + ".jpg"); 
    uri = Uri.fromFile(file); 

    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); 
    intent.putExtra("return-data", true); 

    startActivityForResult(intent, REQUEST_CODE_TAKE_IMAGE); 
} 

private void openGallery() { 

    Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    startActivityForResult(Intent.createChooser(intent, "Select image from your gallery"), REQUEST_CODE_CHOOSE_IMAGE); 

} 

그런 다음 :

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == REQUEST_CODE_TAKE_IMAGE && resultCode == Activity.RESULT_OK) { 
     cropImage(); 

    } else if (requestCode == REQUEST_CODE_CHOOSE_IMAGE && resultCode == Activity.RESULT_OK) { 
     if (data != null) { 
      uri = data.getData(); 
      cropImage(); 

     } 

    } else if (requestCode == REQUEST_CODE_CROP_AVATAR && resultCode == Activity.RESULT_OK) { 

     if (data != null) { 

      Bundle bundle = data.getExtras(); 
      Bitmap bitmap = bundle.getParcelable("data"); 

      ivAvatar.setImageBitmap(bitmap); 
     } 

    } 
} 

private void cropImage() { 
    Intent cropIntent = new Intent("com.android.camera.action.CROP"); 

    cropIntent.setDataAndType(uri, "image/*"); 
    cropIntent.putExtra("crop", true); 
    cropIntent.putExtra("outputX", 180); 
    cropIntent.putExtra("outputY", 180); 

    cropIntent.putExtra("aspectX", 3); 
    cropIntent.putExtra("aspectY", 3); 
    cropIntent.putExtra("scaleUpIfNeeded", true); 
    cropIntent.putExtra("return-data", true); 
    startActivityForResult(cropIntent, REQUEST_CODE_CROP_AVATAR); 

}