如何从Android片段中的相机获取图像
Posted
技术标签:
【中文标题】如何从Android片段中的相机获取图像【英文标题】:How to get image from camera from fragment in Android 【发布时间】:2017-08-12 13:25:06 【问题描述】:在我的代码中,位图为空,但图像创建成功,uri 很好,但 BitmapFactory.decodeFile() 返回空。
我在代码下面使用了片段:
public class CameraImage extends Fragment
private static final int TAKE_PHOTO_CODE = 1888;
Button button;
private Uri fileUri1,fileUri;
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 cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
fileUri1 = getOutputMediaFileUri();
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(cameraIntent, TAKE_PHOTO_CODE);
);
return rootView;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
if (requestCode == TAKE_PHOTO_CODE)
if (resultCode == Activity.RESULT_OK)
BitmapFactory.Options options;
try
Bitmap bitmap = BitmapFactory.decodeFile(pathname);
showDialog(bitmap, 1);
catch (OutOfMemoryError e)
try
options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(pathname, options);
imageView.setImageBitmap(bitmap);
catch (Exception e2)
Log.e("Camera", "" + e2 + " " + e);
public Uri getOutputMediaFileUri()
return Uri.fromFile(getOutputMediaFile());
private static File getOutputMediaFile()
File mediaStorageDir = new File(
Environment
.getExternalStoragePublicDirectory(MyApplication.getAppContext().getFilesDir().getAbsolutePath()),
IMAGE_DIRECTORY_NAME);
if (!mediaStorageDir.exists())
if (!mediaStorageDir.mkdirs())
Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create "
+ IMAGE_DIRECTORY_NAME + " directory");
return null;
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
Locale.getDefault()).format(new Date());
File mediaFile;
try
mediaFile = File.createTempFile(
"IMG_" + timeStamp,
".jpg",
mediaStorageDir
);
catch (Exception e)
Log.e("Camera", "" + e);
mediaFile = new File(mediaStorageDir.getPath() + File.separator
, "IMG_" + timeStamp + ".jpg");
return mediaFile;
在上面的代码中,我在 onActivityResult 的位图上得到了 null,但我从这个图像中得到的 uri 出现在那个位置。
【问题讨论】:
【参考方案1】:我们可以通过相机获得两种类型的图像:
1) 在 onActivityResult 中使用以下代码的缩略图:
Bitmap photo = (Bitmap) data.getExtras().get("data");
Log.i(TAG, "" + photo + " / " + data.getExtras().get("data") + " / " + data.getData());
showDialog(photo, 1);
2) 在 onActivityResult 中使用以下代码获得完整质量的图像:
BitmapFactory.Options options;
options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(pathname, options);
showDialog(bitmap, 1);
3) 轻松舒适地使用第三方:
编译'com.mindorks:paracamera:0.2.2'
paracamera github
【讨论】:
【参考方案2】:我解决了我的问题:
通过更改cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
到
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri1);
【讨论】:
只是我的错误 您在某处是否还有另一个名为fileUri
的变量?它不在您在此处发布的代码中。
当变量名末尾有数字时,您可能做错了什么。在这种情况下,您需要创建更具描述性的名称。您尤其应该注意每个变量都是不同的并且易于识别。变量名不应该太相似以至于容易混淆。
此外,您应该尽可能地使用局部变量而不是成员字段。由于 fileUri1
仅在 onCreateViewI()
内部使用,因此在此处声明它,就像您最初所做的那样。 fileUri
很可能也用在单个方法中,而不是在方法之间共享,所以它也应该是本地的。此更改将帮助您避免像您在发布此问题之前遇到的错误。以上是关于如何从Android片段中的相机获取图像的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Qt/C++ 小部件(不是 QML)从 Android 相机获取图像