使用摄像头意图获取Android中捕获图像的路径
我一直在尝试获取捕获图像的路径,以便删除图像。在StackOverflow上找到了许多答案,但没有一个对我有用。我得到了以下答案:使用摄像头意图获取Android中捕获图像的路径,android,android-camera-intent,Android,Android Camera Intent,我一直在尝试获取捕获图像的路径,以便删除图像。在StackOverflow上找到了许多答案,但没有一个对我有用。我得到了以下答案: 私有字符串getLastImagePath(){ 最终字符串[]imageColumns={MediaStore.Images.Media.\u ID, MediaStore.Images.Media.DATA}; 最终字符串imageOrderBy=MediaStore.Images.Media.\u ID+“DESC”; Cursor imageCursor=P
私有字符串getLastImagePath(){
最终字符串[]imageColumns={MediaStore.Images.Media.\u ID,
MediaStore.Images.Media.DATA};
最终字符串imageOrderBy=MediaStore.Images.Media.\u ID+“DESC”;
Cursor imageCursor=POS.this.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL\u CONTENT\u URI、imageColumns、,
null,null,imageOrderBy);
if(imageCursor.moveToFirst()){
//int id=imageCursor.getInt(imageCursor
//.getColumnIndex(MediaStore.Images.Media._ID));
String fullPath=imageCursor.getString(imageCursor
.getColumnIndex(MediaStore.Images.Media.DATA));
返回全路径;
}否则{
返回“”;
}
}
此代码适用于三星标签,但不适用于联想标签和i-ball标签。
那么,有人能帮我找到另一个解决方案来做同样的事情吗?
任何帮助都将不胜感激。多谢各位
这是我的onActivityResult:
if(requestCode==CmsInter.CAMERA\u请求和&resultCode==RESULT\u确定){
//位图照片=空;
//photo=(位图)data.getExtras().get(“数据”);
字符串txt=“”;
如果(im!=null){
字符串结果=”;
//im.setImageBitmap(照片);
im.setTag(“2”);
int index=im.getId();
字符串路径=getLastImagePath();
试一试{
bitmap1=BitmapFactory.decodeFile(路径、选项);
位图=位图.createScaledBitmap(位图1、512、400、false);
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
compress(bitmap.CompressFormat.PNG,100,baos);
byte[]bytData=bas.toByteArray();
试一试{
baos.close();
}捕获(IOE异常){
e、 printStackTrace();
}
结果=Base64.encode(bytData);
bytData=null;
}捕获(OutOfMemoryError ooM){
System.out.println(“OutOfMemory异常------>”+ooM);
bitmap1.recycle();
bitmap.recycle();
}最后{
bitmap1.recycle();
bitmap.recycle();
}
}
}
试试这个
String[] projection = { MediaStore.Images.Media.DATA };
@SuppressWarnings("deprecation")
Cursor cursor = managedQuery(mCapturedImageURI, projection,
null, null, null);
int column_index_data = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
image_path = cursor.getString(column_index_data);
Log.e("path of image from CAMERA......******************.........",
image_path + "");
用于捕获图像:
String fileName = "temp.jpg";
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, fileName);
mCapturedImageURI = getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
values.clear();
像这样试试
如下图所示通过摄像机
Intent-Intent=新意图(本);
startActivityForResult(意图、要求、摄像机图像);
拍摄完图像后,在ActivityResult上写一个,如下所示
activityresult上受保护的void(int-requestCode、int-resultCode、Intent-data){
if(requestCode==CAMERA\u请求和&resultCode==RESULT\u确定){
位图照片=(位图)数据.getExtras().get(“数据”);
设置图像位图(照片);
旋钮设置可见性(按钮可见);
//调用此方法从位图获取URI
Uri tempUri=getImageUri(getApplicationContext(),photo);
//调用此方法以获取实际路径
File finalFile=新文件(getRealPathFromURI(tempUri));
System.out.println(mImageCaptureUri);
}
}
公共Uri getImageUri(文本中的上下文,图像中的位图){
ByteArrayOutputStream字节=新建ByteArrayOutputStream();
inImage.compress(位图.CompressFormat.JPEG,100,字节);
字符串路径=Images.Media.insertImage(inContext.getContentResolver(),inImage,“Title”,null);
返回Uri.parse(路径);
}
公共字符串getRealPathFromURI(Uri){
字符串路径=”;
if(getContentResolver()!=null){
Cursor Cursor=getContentResolver().query(uri,null,null,null,null);
如果(光标!=null){
cursor.moveToFirst();
int idx=cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
path=cursor.getString(idx);
cursor.close();
}
}
返回路径;
}
并检查日志
编辑:
很多人都在问,怎么才能不得到缩略图。您需要为getImageUri
方法添加此代码:
public Uri getImageUri(Context inContext, Bitmap inImage) {
Bitmap OutImage = Bitmap.createScaledBitmap(inImage, 1000, 1000,true);
String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), OutImage, "Title", null);
return Uri.parse(path);
}
另一种方法压缩文件。您可以通过更改编号来调整大小10001000
尝试此方法以获取相机拍摄的原始图像的路径
public String getOriginalImagePath() {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = getActivity().managedQuery(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection, null, null, null);
int column_index_data = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToLast();
return cursor.getString(column_index_data);
}
此方法将返回相机捕获的最后一幅图像的路径。因此,此路径将是原始图像,而不是缩略图位图。有一个解决方案,可以创建文件(在外部缓存目录或其他任何位置),并将此文件的uri作为相机意图的额外输出-这将定义存储拍摄照片的路径
以下是一个例子:
File file;
Uri fileUri;
final int RC_TAKE_PHOTO = 1;
private void takePhoto() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
file = new File(getActivity().getExternalCacheDir(),
String.valueOf(System.currentTimeMillis()) + ".jpg");
fileUri = Uri.fromFile(file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
getActivity().startActivityForResult(intent, RC_TAKE_PHOTO);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_TAKE_PHOTO && resultCode == RESULT_OK) {
//do whatever you need with taken photo using file or fileUri
}
}
}
然后,如果不再需要该文件,可以使用file.delete()将其删除代码>
顺便说一下,当用户从应用程序设置中清除应用程序的缓存时,缓存目录中的文件将被删除。这里我更新了Kotlin中的示例代码。请注意牛轧糖及以上版本的Uri.fromFile(file)
不起作用,它会使应用程序崩溃,因为需要实现FileProvider,这是从intent发送文件的最安全的方式。要实现此功能,请参阅此或此
camera()拍摄的私人娱乐照{
val isDeviceSupportCamera:Boolean=此.packageManager.hasSystemFeature(packageManager.FEATURE\u摄像头)
如果(isDeviceSupportCamera){
val takePictureContent=Intent(MediaStore.ACTION\u IMAGE\u捕获)
if(takePictureContent.resolveActivity(getPackageManager())!=null){
file=file(getExternalFilesDir(Environment.DIRECTORY\u DOCUMENTS+“/attachments”)!!.path,
System.currentTimeMillis().toString()+
private fun takePhotoFromCamera() {
val isDeviceSupportCamera: Boolean = this.packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)
if (isDeviceSupportCamera) {
val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
file = File(getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS + "/attachments")!!.path,
System.currentTimeMillis().toString() + ".jpg")
// fileUri = Uri.fromFile(file)
fileUri = FileProvider.getUriForFile(this, this.applicationContext.packageName + ".provider", file!!)
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri)
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) {
takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
}
startActivityForResult(takePictureIntent, Constants.REQUEST_CODE_IMAGE_CAPTURE)
}
} else {
Toast.makeText(this, this.getString(R.string.camera_not_supported), Toast.LENGTH_SHORT).show()
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK) {
if(requestCode == Constants.REQUEST_CODE_IMAGE_CAPTURE) {
realPath = file?.path
//do what ever you want to do
}
}
}