希望这不是一个重复的问题,我正在制作一个应用程序,我想要一个按钮来打开相机应用程序(默认的Android相机应用程序)。我该如何做到这一点?我知道有一个函数:
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE)
我需要使用那个吗?而且我怎么从xml文件中调用那个按钮?
还有,我需要担心存储那张图片或视频吗?或者默认的相机应用会处理它们吗?
希望这不是一个重复的问题,我正在制作一个应用程序,我想要一个按钮来打开相机应用程序(默认的Android相机应用程序)。我该如何做到这一点?我知道有一个函数:
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE)
我需要使用那个吗?而且我怎么从xml文件中调用那个按钮?
还有,我需要担心存储那张图片或视频吗?或者默认的相机应用会处理它们吗?
要调用相机,您可以使用:
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
startActivity(intent);
图像将会自动保存在默认目录中。
而且你需要在AndroidManifest.xml文件中设置相机的权限:
<uses-permission android:name="android.permission.CAMERA"> </uses-permission>
Button b = (Button)findViewById(R.id.Button01);
b.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
}
});
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAMERA_PIC_REQUEST) {
Bitmap image = (Bitmap) data.getExtras().get("data");
ImageView imageview = (ImageView) findViewById(R.id.ImageView01); //sets imageview as the bitmap
imageview.setImageBitmap(image);
}
}
startActivityforResult
传递请求代码,当 OnActivityResult
被调用时,它将返回相同的代码。在你的类中像这样声明代码:private static final int CAMERA_PIC_REQUEST = 1337;
- Ram Suthakardata.getExtras().get("data")
返回的是缩略图,会失去图片质量... - Yuki Tanaka您可以创建一个相机意图,并调用它作为startActivityForResult(intent)。
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// start the image capture Intent
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
Camera=(Button)findViewById(R.id.CameraID);
Camera.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent Intent3=new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
startActivity(Intent3);
}
});
以下代码正是您想要的
//在点击事件中使用此意图
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent,CAMERA_REQUEST);
//上述代码用于“onActivityResult”中
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_REQUEST) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
image.setImageBitmap(photo);
}
}
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(intent);
<uses-permission android:name="android.permission.CAMERA">
这段代码打开相机,拍照后保存图片到图库中,并新建一个图像集。
ImagePro.Java
public class ImagePro
{
public static String TAG = "ImagePro";
Activity activity;
Uri mImageCaptureUri;
public static int CAMERA_CODE = 64;
public static int GALLERY_CODE = 74;
public static int CROPPING_CODE = 84;
private final static int REQUEST_PERMISSION_REQ_CODE = 704;
public ImagePro(Activity activity) {
this.activity = activity;
this.outPutFile = new File(android.os.Environment.getExternalStorageDirectory(), "temp.jpg");
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_REQ_CODE);
}
}
private void LogToast(String message) {
try {
Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
Log.d(TAG, message);
}
private void Toast(String message) {
try {
Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
private void Log(String message) {
Log.d(TAG, message);
}
/**
* This function return captured image path
*
* @param requestCode on activity result requestCode
* @param resultCode on activity result resultCode
* @param intent on activity result intent
* @return ImageDetails values
*/
public ImageDetails getImagePath(int requestCode, int resultCode, Intent intent) {
ImageDetails imageDetails = new ImageDetails();
if(resultCode == Activity.RESULT_OK) {
if(requestCode == CAMERA_CODE) {
imageDetails.setUri(mImageCaptureUri);
imageDetails.setPath(mImageCaptureUri.getPath());
Bitmap bitmap = null;
try {
bitmap = MediaStore.Images.Media.getBitmap(activity.getContentResolver(), mImageCaptureUri);
} catch (IOException e) {
LogToast(e.getMessage());
e.printStackTrace();
}
imageDetails.setBitmap(bitmap);
imageDetails.setFile(new File(mImageCaptureUri.getPath()));
} else if(requestCode == GALLERY_CODE) {
Uri uri = intent.getData();
imageDetails.setUri(uri);
Bitmap bitmap = null;
try {
bitmap = MediaStore.Images.Media.getBitmap(activity.getContentResolver(), uri);
} catch (IOException e) {
LogToast(e.getMessage());
e.printStackTrace();
}
imageDetails.setBitmap(bitmap);
imageDetails.setFile(new File(uri.getPath()));
imageDetails.setPath(uri.getPath());
} else if(requestCode == CROPPING_CODE) {
try {
if(outPutFile.exists()){
imageDetails.setUri(Uri.fromFile(outPutFile));
imageDetails.setFile(outPutFile);
imageDetails.setPath(outPutFile.getPath());
Bitmap photo = decodeFile(outPutFile);
imageDetails.setBitmap(photo);
}
else {
LogToast("Error while save image");
}
} catch (Exception e) {
e.printStackTrace();
LogToast(e.getMessage());
}
}
} else {
LogToast("user cancelled.");
}
return imageDetails;
}
/**
* Open image pick dialog.<br/>
* CAMERA_CODE</br>
* GALLERY_CODE
*/
public void openImagePickOption() {
final CharSequence[] items = { "Capture Photo", "Choose from Gallery", "Cancel" };
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Add Photo!");
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
if (items[item].equals("Capture Photo")) {
captureImage();
} else if (items[item].equals("Choose from Gallery")) {
pickImage();
} else if (items[item].equals("Cancel")) {
dialog.dismiss();
}
}
});
builder.show();
}
/**
* decode from file to bitmap
* @param f file
* @return Bitmap data
*/
private Bitmap decodeFile(File f) {
try {
// decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(f), null, o);
// Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE = 512;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
// decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
} catch (FileNotFoundException e) {
Log(e.getMessage());
}
return null;
}
/**
* Capture image using camera <br/>
* REQUEST_CODE = ImagePro.CAMERA_CODE
*/
public void captureImage() {
if(activity != null) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File f = new File(android.os.Environment.getExternalStorageDirectory(), "temp1.jpg");
mImageCaptureUri = Uri.fromFile(f);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
activity.startActivityForResult(intent, CAMERA_CODE);
} else {
LogToast("Activity not assigned");
}
}
/**
* pick image from gallery
*/
public void pickImage() {
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
activity.startActivityForResult(i, GALLERY_CODE);
}
/**
* cropping the uri image
* @param uri - open cropping dialog using the uri data
*/
public void croppingImage(Uri uri) {
CroppingIMG(uri);
}
int CROP_IMG_X=512;
int CROP_IMG_Y=512;
public void croppingImage(Uri uri, int cropX, int cropY) {
CROP_IMG_X = cropX;
CROP_IMG_Y = cropY;
CroppingIMG(uri);
}
File outPutFile=null;
private void CroppingIMG(Uri uri) {
final ArrayList<CroppingOption> cropOptions = new ArrayList<>();
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setType("image/*");
List<ResolveInfo> list = activity.getPackageManager().queryIntentActivities( intent, 0 );
int size = list.size();
if (size == 0) {
LogToast("Can't find image croping app");
} else {
intent.setData(uri);
intent.putExtra("outputX", CROP_IMG_X);
intent.putExtra("outputY", CROP_IMG_Y);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);
//Create output file here
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outPutFile));
if (size == 1) {
Intent i = new Intent(intent);
ResolveInfo res = list.get(0);
i.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
activity.startActivityForResult(i, CROPPING_CODE);
} else {
for (ResolveInfo res : list) {
final CroppingOption co = new CroppingOption();
co.title = activity.getPackageManager().getApplicationLabel(res.activityInfo.applicationInfo);
co.icon = activity.getPackageManager().getApplicationIcon(res.activityInfo.applicationInfo);
co.appIntent = new Intent(intent);
co.appIntent.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
cropOptions.add(co);
}
CropingOptionAdapter adapter = new CropingOptionAdapter(activity.getApplicationContext(), cropOptions);
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose Cropping App");
builder.setCancelable(false);
builder.setAdapter( adapter, new DialogInterface.OnClickListener() {
public void onClick( DialogInterface dialog, int item ) {
activity.startActivityForResult( cropOptions.get(item).appIntent, CROPPING_CODE);
}
});
builder.setOnCancelListener( new DialogInterface.OnCancelListener() {
@Override
public void onCancel( DialogInterface dialog ) {
if (mImageCaptureUri != null ) {
activity.getContentResolver().delete(mImageCaptureUri, null, null );
mImageCaptureUri = null;
}
}
} );
AlertDialog alert = builder.create();
alert.show();
}
}
}
/**
* Capture image using camera<br/>
* REQUEST_CODE = User defined code<br/>
* <br/>
* @param iRequestCode User defined code
*/
public void captureImage(int iRequestCode) {
CAMERA_CODE = iRequestCode;
captureImage();
}
/**
* get path, bitmap, file and uri from image details object
*/
public class ImageDetails {
String path="";
Bitmap bitmap=null;
File file=null;
Uri uri=null;
public Uri getUri() {
return uri;
}
public void setUri(Uri uri) {
this.uri = uri;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public Bitmap getBitmap() {
return bitmap;
}
public void setBitmap(Bitmap bitmap) {
this.bitmap = bitmap;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
}
/**
* Created by DP on 7/12/2016.
*/
public class CroppingOption {
public CharSequence title;
public Drawable icon;
public Intent appIntent;
}
public class CropingOptionAdapter extends ArrayAdapter {
private ArrayList<CroppingOption> mOptions;
private LayoutInflater mInflater;
public CropingOptionAdapter(Context context, ArrayList<CroppingOption> options) {
super(context, R.layout.croping_selector, options);
mOptions = options;
mInflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView, ViewGroup group) {
if (convertView == null)
convertView = mInflater.inflate(R.layout.croping_selector, null);
CroppingOption item = mOptions.get(position);
if (item != null) {
((ImageView) convertView.findViewById(R.id.img_icon)).setImageDrawable(item.icon);
((TextView) convertView.findViewById(R.id.txt_name)).setText(item.title);
return convertView;
}
return null;
}
}
}
MainActivity.java
ImagePro imagePro;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imagePro = new ImagePro(this);
}
public void onClickUploadImageButton(View view) {
imagePro.openImagePickOption();
}
onActivityResult
if(requestCode == CAMERA_CODE && resultCode == RESULT_OK) {
imageDetails = imagePro.getImagePath(CAMERA_CODE, RESULT_OK, data);
ivCrop.setImageBitmap(imageDetails.getBitmap());
//imageDetails.getPath(), imageDetails.getBitmap(), imageDetails.getUri(), imageDetails.getFile
}
Intent intent = new
Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// start the image capture Intent
startActivityForResult(intent,
CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
你对Intent中使用的操作是正确的,但这并不是你所要做的唯一事情。你还需要添加
startActivityForResult(intent, YOUR_REQUEST_CODE);
要完成所有操作并检索实际图片,您可以查看以下主题。
public class camera_act extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera_act);
ImageView imageView = findViewById(R.id.image);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent,90);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode,resultCode,data);
Bitmap bitmap = data.getExtras.get("imageKey");
imageView.setBitmapImage(bitmap);
}
}
}