从相机拍摄照片中的照片

在我的Fragment我尝试从我的相机拍照,但我的Fragment onActivityResult不叫。 拍摄照片后,这个Fragment没有显示,正在切换到我的第一个Fragment 。 还有其他的方式来捕捉Fragment照片,或者我做错了什么?

这是我现在的代码:

 public void takePhoto() { Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); File photo = new File(Environment.getExternalStorageDirectory(), "Pic.jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo)); imageUri = Uri.fromFile(photo); PhotosListFragment.this.startActivityForResult(intent, 100); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case 100: if (resultCode == Activity.RESULT_OK) { Uri selectedImage = imageUri; getActivity().getContentResolver().notifyChange(selectedImage, null); ContentResolver cr = getActivity().getContentResolver(); Bitmap bitmap; try { bitmap = android.provider.MediaStore.Images.Media .getBitmap(cr, selectedImage); viewHolder.imageView.setImageBitmap(bitmap); Toast.makeText(getActivity(), selectedImage.toString(), Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(getActivity(), "Failed to load", Toast.LENGTH_SHORT) .show(); Log.e("Camera", e.toString()); } } } } 

Solutions Collecting From Web of "从相机拍摄照片中的照片"

我试着你的代码工作很好的家伙。 我变了

 PhotosListFragment.this.startActivityForResult(intent, 100); 

 getActivity().startActivityForResult(intent, 100); 

拍完照片后,又回到同样的活动。

我认为你的两个片段都是一样的活动。

如果是这种情况,我build议你创build一个新的活动,把新的片段放在那里。

希望对你有帮助:

 public class CameraImage extends Fragment { private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 1888; Button button; ImageView imageView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View rootView = inflater.inflate(R.layout.camera_image, container, false); button = (Button) rootView.findViewById(R.id.button); imageView = (ImageView) rootView.findViewById(R.id.imageview); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); } }); return rootView; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { if (resultCode == Activity.RESULT_OK) { Bitmap bmp = (Bitmap) data.getExtras().get("data"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray(); // convert byte array to Bitmap Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); imageView.setImageBitmap(bitmap); } } } } 

这是最受欢迎的问题之一。 我们可以在这个问题上find很多线索。 但是没有一个对我有用。

所以我用这个解决scheme解决了这个问题。

我们先来了解为什么会这样。

我们可以直接从Fragment调用startActivityForResult ,但实际上后面的机制都是由Activity处理的。

一旦从Fragment调用startActivityForResult ,requestCode将被更改为将Fragment的标识附加到代码中。 这将使活动能够追踪收到结果后谁发送此请求。

一旦Activity导航回来,结果将被发送到Activity的onActivityResult与修改的requestCode将被解码为原始的requestCode + Fragment的身份。 之后,Activity将通过onActivityResult将活动结果发送到该片段。 这一切都完成了。

问题是:

活动可以将结果发送到仅直接附加到活动的片段,而不是嵌套的片段。 这就是为什么嵌套片段的onActivityResult不会被调用的原因。

解:

1)通过以下代码启动您的片段中的相机意图:

  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Fragment frag = this; /** Pass your fragment reference **/ frag.startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); // REQUEST_IMAGE_CAPTURE = 12345 

2)现在在您的父级活动覆盖** onActivityResult() :**

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

你必须在父母的活动中调用它来使其工作。

3)在你的片段调用:

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { if (requestCode == REQUEST_IMAGE_CAPTURE) { // Do something with imagePath Bitmap photo = (Bitmap) data.getExtras().get("data"); imageview.setImageBitmap(photo); // CALL THIS METHOD TO GET THE URI FROM THE BITMAP Uri selectedImage = getImageUri(getActivity(), photo); String realPath=getRealPathFromURI(selectedImage); selectedImage = Uri.parse(realPath); } } } 

4)获取URI的参考方法:

– >从位图获取Uri的方法

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

– >从Uri获取文件path的方法

  public String getRealPathFromURI(Uri contentUri) { Cursor cursor = null; try { String[] proj = { MediaStore.Images.Media.DATA }; cursor = getActivity().getContentResolver().query(contentUri, proj, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } finally { if (cursor != null) { cursor.close(); } } } 

而已。 有了这个解决scheme,它可以应用于任何单一的片段,无论是否嵌套。 是的,它也涵盖了所有的情况! 此外,代码也很好,干净。

对于片段,这是最简单的解决scheme:

 cameraIamgeView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent cameraIntent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); getActivity().startActivityFromFragment(PlaceOrderFragment.this, cameraIntent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); } }); @Override public void onActivityResult(int requestCode, int resultCode, Intent data){ // super.onActivityResult(requestCode, resultCode, data); try { if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { if (resultCode == Activity.RESULT_OK && data != null) { Bitmap bmp = (Bitmap) data.getExtras().get("data"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); /* bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray(); // convert byte array to Bitmap Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); */ cameraIamgeView.setImageBitmap(bmp); } } }catch(Exception e){ Toast.makeText(this.getActivity(), e+"Something went wrong", Toast.LENGTH_LONG).show(); } }