我希望我的应用能够在不使用其他应用的情况下捕获照片。我使用的代码:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File photo = null;
try
{
photo = this.createTemporaryFile("picture", ".jpg");
photo.delete();
}
catch(Exception e)
{
Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();
}
mImageUri = Uri.fromFile(photo);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
但是此代码使用手机的主要相机应用程序。谁能给我一些代码?
答案 0 :(得分:4)
直接使用Camera
课程拍照是非常复杂的。
我正在使用a library to simplify this,您只需在应用中为基本预览界面添加CameraFragment
,然后在其上调用takePicture()
即可拍摄照片,并以各种方式配置行为(例如,保存图片的位置)。但是,这个库仍在进行中。
有人能给我一些代码吗?
“一些代码”将长达数千行(用于完整的实现,包括处理各种特定于设备的特殊情况)。
答案 1 :(得分:1)
设置完相机预览后,您需要执行以下操作...
protected static final int MEDIA_TYPE_IMAGE = 0;
public void capture(View v)
{
PictureCallback pictureCB = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera cam) {
File picFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
if (picFile == null) {
Log.e(TAG, "Couldn't create media file; check storage permissions?");
return;
}
try {
FileOutputStream fos = new FileOutputStream(picFile);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
Log.e(TAG, "File not found: " + e.getMessage());
e.getStackTrace();
} catch (IOException e) {
Log.e(TAG, "I/O error writing file: " + e.getMessage());
e.getStackTrace();
}
}
};
camera.takePicture(null, null, pictureCB);
}
getOutputMediaFile函数:
private File getOutputMediaFile(int type)
{
File dir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), getPackageName());
if (!dir.exists())
{
if (!dir.mkdirs())
{
Log.e(TAG, "Failed to create storage directory.");
return null;
}
}
String timeStamp = new SimpleDateFormat("yyyMMdd_HHmmss", Locale.UK).format(new Date());
if (type == MEDIA_TYPE_IMAGE)
{
return new File(dir.getPath() + File.separator + "IMG_"+ timeStamp + ".jpg");
}
else
{
return null;
}
}
你已经完成了!!!
找到它here
答案 2 :(得分:0)
相机在API 21中已弃用,新方法是使用android.hardware.camera2。
要枚举,查询和打开可用的相机设备,请获取一个CameraManager实例。
要快速总结:
Context.getSystemService(String)
string[]
获得CameraManager.GetCameraIdList()
的设备相机ID。打开摄像机后,将调用OpenCamera(...)中提供的回调。