Android之调用摄像头拍照和从相册中选择照片
来源:互联网 发布:傻黑的淘宝店 编辑:程序博客网 时间:2024/05/22 15:08
很多应用程序都可能会用到调用摄像头拍照的功能,比如说程序里需要上传一张图片作为用户的头像,这时就会调用手机的摄像头,下面我们可以用一个例子来学习下。
新建一个PicDemo项目,然后修改main.xml中的代码,代码如下:
<RelativeLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:id=”@+id/activity_main”
android:layout_width=”match_parent”
android:layout_height=”match_parent”><Button
android:id=”@+id/take_photo”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Take Photo”/><ImageView
android:id=”@+id/picture”
android:layout_width=”400dp”
android:layout_height=”400dp”
android:layout_centerInParent=”true”/></RelativeLayout>
可以看到,布局里面只有两个控件,Button和ImageView.Button适用于打开摄像头进行拍照的,而ImageView则是用于将拍到的图片显示出来。
下面我们开始编写具体逻辑
public class MainActivity extends AppCompatActivity {
public static final int TAKE_PHOTO = 1;
public static final int CROP_PHOTO = 2;
private Button takephoto,choosephoto;
private ImageView picture;
private Uri imageUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
takephoto = (Button)findViewById(R.id.take_photo);
picture = (ImageView) findViewById(R.id.picture);
//调用手机相机
takephoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建File对象,用于储蓄拍照后的照片
File outputImage = newFile(Environment.getExternalStorageDirectory(),
“tempImage.jpg”);
try{
if (outputImage.exists()){
outputImage.delete();
}
outputImage.createNewFile();
}catch (Exception e){
e.printStackTrace();
}
imageUri = Uri.fromFile(outputImage);
Intent intent =new Intent(“android.media.action.IMAGE_CAPTURE”);
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intent,TAKE_PHOTO);
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case TAKE_PHOTO:
if (resultCode == RESULT_OK){
Intent intent = new Intent(“com.android.camera.action.CROP”);
intent.setDataAndType(imageUri,”image/*”);
intent.putExtra(“scale”,true);
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intent,CROP_PHOTO);
}
break;
case CROP_PHOTO:
if (resultCode == RESULT_OK){
try{
Bitmap bitmap = BitmapFactory.decodeStream(
getContentResolver().openInputStream(imageUri));
picture.setImageBitmap(bitmap);
}catch (FileNotFoundException e){
e.printStackTrace();
}
}
break;
default:
break;
}
}
}
上述代码中,我们调用了手机相机拍照,将照片储存在SD卡的根目录中,并在显示照片时对照片进行剪裁,现在在ImageView中。由于涉及到SD卡的读写,我们还要在AndroidManifest.xml文件中申明权限:
…
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE” />
…
这样代码就完成,单机takephoto按钮就可以进行拍照了。
从相册中选择照片
首先在main.xml文件中加入一个Button,代码如下:
<RelativeLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:id=”@+id/activity_main”
android:layout_width=”match_parent”
android:layout_height=”match_parent”><Button
android:id=”@+id/take_photo”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Take Photo”/><Button
android:id=”@+id/choose_photo”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Choose Photo”
android:layout_centerHorizontal=”true”/><ImageView
android:id=”@+id/picture”
android:layout_width=”400dp”
android:layout_height=”400dp”
android:layout_centerInParent=”true”/></RelativeLayout>
然后修改MainActivity中的代码,代码如下:
……
private Button choose_photo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
……
choose_photo = (Button)findViewById(R.id.choose_photo);
choosephoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(){
@Override
public void run() {
File outputImage = new File(Environment.getExternalStorageDirectory(),”output_image.jpg” );
try{
if (outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
}catch (IOException e){
e.printStackTrace();
}
imageUri = Uri.fromFile(outputImage);
Intent intent = new Intent(“android.intent.action.GET_CONTENT”);
intent.setType(“image/*”);
intent.putExtra(“crop”,true);//图片是否可以剪裁
intent.putExtra(“scale”,true);//图片加载模式
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intent,TAKE_PHOTO);
}
}.start();
}
});
}
……
}
这样,你就可以对相册中的照片进行选择了。
- Android之调用摄像头拍照和从相册中选择照片
- Android 调用摄像头拍照 以及 从相册中选择照片
- 调用摄像头拍照和从相册中选择照片
- 调用摄像头拍照及从相册中选择照片
- Aandroid调用摄像头拍照和从相册选择照片
- android调用摄像头拍照,从相册中选择照片并裁剪
- Android从相册选择图片和调用系统摄像头拍照
- 调用摄像头拍照和从相册中选择
- 调用摄像头和相册(调用摄像头拍照和从相册中选择图片)
- Android调用摄像头拍照和从相册中选择(上传、更换头像)
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片,剪裁
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片
- java类里面不可以做逻辑运算,输出
- 如何在 Linux 上使用 GNU sed
- 一个人也要生活的精彩——懒人焖饭
- jQuery 基础DOM和CSS操作
- 鼠标事件的继承操作
- Android之调用摄像头拍照和从相册中选择照片
- Jsp/servlet的声明周期
- Oracle事务的执行1
- leetCode练习(84)
- (四)java开发常用类(包装,数字处理集合等)(上)
- 《android网络请求框架》一个轻量级的异步网络请求框架MyHttpUtils(新版更新记录,版本号:2.X)
- 丁成云师姐的-MySQL分享
- Centos7开机不久桌面卡住,只有鼠标可以移动的解决办法
- Servlet load-on-startup