2015-01-05 3 views
0

Android 휴대 전화에서 카메라로 이미지를 찍고 있습니다. 이미지를 찍은 후 전체 이미지를 자르기 의도 (com.android.camera.action.CROP)에 대한 URI로 전달합니다. 그러나 작물 인 텐트가 돌아 오면 축소판 크기로 다시 나타납니다. 카메라에서 이미지를 파일로 저장하고 대신 파일의 URI를 보내려고했지만 이미지가 자르기 의도로 열리지 않습니다. 내가 보낸 소포에서 자르기 의도로 잘라낸 전체 크기 이미지를 어떻게 얻을 수 있습니까? 여기 내가 사용하고 코드의 일부는 다음과 같습니다Android 전체 이미지 자르기 의도에서

public void onActivityResult(int requestCode, int resultCode, 
     Intent intent) { 
    if (resultCode != Activity.RESULT_CANCELED) { 
     Uri uri = null; 
     switch (requestCode) { 
     case FILE_SELECT_CODE: 
      if (intent.getData() != null) { 
       uri = intent.getData(); 
       cropSelectedPicture(uri); 
      } 
      break; 
     case PICTURE_SELECT_CODE: 
      uri = intent.getData(); 
      if (uri == null) { 
       Bundle bundle = intent.getExtras(); 
       Bitmap photo = null; 
       if (bundle != null) { 
        photo = bundle.getParcelable("data"); 
       } 
       finishChangeProfilePicture(photo); 
      } else { 
       cropSelectedPicture(uri); 
      } 
      break; 
     case FILE_CROP_CODE: 
      Bundle extras = intent.getExtras(); 
      Bitmap thePic = extras.getParcelable("data"); 
      uri = extras.getParcelable("uri"); 
      finishChangeProfilePicture(thePic); 
      break; 
     } 
    } 
    super.onActivityResult(requestCode, resultCode, intent); 
} 

public void showCamera() { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    intent.putExtra("crop", "true"); 
    intent.putExtra("outputX", pictureWidth); 
    intent.putExtra("outputY", pictureHeight); 
    intent.putExtra("aspectX", pictureWidth); 
    intent.putExtra("aspectY", pictureHeight); 
    intent.putExtra("scale", true); 
    intent.putExtra("return-data", true); 
    try { 
     cordova.startActivityForResult(
       this, Intent.createChooser(intent, "Take Picture"), 
       PICTURE_SELECT_CODE); 
    } catch (android.content.ActivityNotFoundException ex) { 
     // Potentially direct the user to the Market with a Dialog 
     Toast.makeText(context, "Please install a Camera application.", 
       Toast.LENGTH_SHORT).show(); 
    } 
} 

public void cropSelectedPicture(Uri uri) { 
    Intent intent = new Intent("com.android.camera.action.CROP"); 
    intent.setDataAndType(uri, "image/*"); 
    intent.putExtra("crop", "true"); 
    intent.putExtra("outputX", pictureWidth); 
    intent.putExtra("outputY", pictureHeight); 
    intent.putExtra("aspectX", pictureWidth); 
    intent.putExtra("aspectY", pictureHeight); 
    intent.putExtra("scale", true); 
    intent.putExtra("return-data", true); 

    PackageManager packageManager = context.getPackageManager(); 
    List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0); 
    if (activities.size() > 0) { 
     for (int i = 0; i < activities.size(); i++) { 
      String label = (String) activities.get(i).loadLabel(packageManager); 
      if (label.equals("Crop picture")) { 
       ActivityInfo activity = activities.get(i).activityInfo; 
       ComponentName name = new ComponentName (activity.applicationInfo.packageName, 
                 activity.name); 
       intent.setComponent(name); 
      } 
     } 
    } 

    try { 
     cordova.startActivityForResult(this, intent, FILE_CROP_CODE); 
    } catch (android.content.ActivityNotFoundException ex) { 
     Toast.makeText(context, "Please install a Cropping program", Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

안드로이드가없는'CROP''Intent' : http://commonsware.com/blog/2013/01/23/no-android-does-not-have-crop-intent.html – CommonsWare

+0

@CommonsWare 본인의 블로그 게시물을이 질문에 게시했습니다. 내가 본 적이없는 것은 귀하의 게시물에있는 도서관 외부의 권장 사항입니다. 존재하지 않는 자르기 의도는 갤러리가 설치 될 때 잘 작동합니다. 하지만 Google+ 사진 앱을 사용하면 잘 찢어지고 아무 일도 일어나지 않습니다. – KickingLettuce

+0

@KickingLettuce : "갤러리가 설치되었을 때 존재하지 않는 자르기 의도가 잘 작동합니다."- 갤러리가 장치 제조업체 나 ROM 편집자에 의해 수정되지 않은 경우 및 갤러리 응용 프로그램이 문서화되지 않은 상태로 유지하는 한 지원되지 않는 API 및 사용자가 갤러리 앱을 선택하는 한. 갤러리 앱은 모든 기기에 존재하지 않으며, Google+ 사진 (언급 한 것처럼) 또는 다른 앱 (기기 제조업체 또는 ROM 모드의 요청에 따라)으로 대체되었습니다. – CommonsWare

답변

1

좋아, 내가해야 할 일을했을 어떤 카메라 의도에서 URI를 저장하고 작물 의도에서 나오는 때 그 의도에 이미지를 저장했다. 이전에 한 번 시도 했었지만 콘텐츠 확인자 대신 앱에 대한 내부 파일이었습니다. (공정한 경고 :이 코드는 원시 안드로이드 프로젝트가 아닌 코드바 프로젝트이므로 Media.getBitmap 행에 문제가있는 경우 cordova.getActivity() 부분을 제거하면 제대로 작동합니다.) 변경된 내용은 다음과 같습니다. :

public void onActivityResult(int requestCode, int resultCode, 
     Intent intent) { 
    if (resultCode != Activity.RESULT_CANCELED) { 
     switch (requestCode) { 
     case FILE_SELECT_CODE: 
      if (intent.getData() != null) { 
       uri = intent.getData(); 
       cropSelectedPicture(); 
      } 
      break; 
     case PICTURE_SELECT_CODE: 
      uri = intent.getData(); 
      if (uri == null) { 
       Bundle bundle = intent.getExtras(); 
       Bitmap photo = null; 
       if (bundle != null) { 
        photo = bundle.getParcelable("data"); 
       } 
       finishChangeProfilePicture(photo); 
      } else { 
       cropSelectedPicture(); 
      } 
      break; 
     case FILE_CROP_CODE: 
      Bitmap theUriPic; 
      try { 
       theUriPic = Media.getBitmap(cordova.getActivity().getContentResolver(), uri); 
       finishChangeProfilePicture(theUriPic); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      break; 
     } 
    } 
    super.onActivityResult(requestCode, resultCode, intent); 
} 

public void cropSelectedPicture() { 
    Intent intent = new Intent("com.android.camera.action.CROP"); 
    intent.setDataAndType(uri, "image/*"); 
    intent.putExtra("crop", "true"); 
    intent.putExtra("outputX", pictureWidth); 
    intent.putExtra("outputY", pictureHeight); 
    intent.putExtra("aspectX", pictureWidth); 
    intent.putExtra("aspectY", pictureHeight); 
    intent.putExtra("scale", true); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); 
    intent.putExtra("return-data", true); 

    PackageManager packageManager = context.getPackageManager(); 
    List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0); 
    if (activities.size() > 0) { 
     for (int i = 0; i < activities.size(); i++) { 
      String label = (String) activities.get(i).loadLabel(packageManager); 
      if (label.equals("Crop picture")) { 
       ActivityInfo activity = activities.get(i).activityInfo; 
       ComponentName name = new ComponentName (activity.applicationInfo.packageName, 
                 activity.name); 
       intent.setComponent(name); 
      } 
     } 
    } 

    try { 
     cordova.startActivityForResult(this, intent, FILE_CROP_CODE); 
    } catch (android.content.ActivityNotFoundException ex) { 
     Toast.makeText(context, "Please install a Cropping program", Toast.LENGTH_SHORT).show(); 
    } 
}