Android 调用系统相机

时间:2023-02-07 20:30:46
package wkk.app3;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;

import java.io.File;

public class MainActivity extends AppCompatActivity {

private static final int IMAGE = 1;
private String path;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
path = getPath() + "/image.png";
}


public void onClick(View view) {
//调用系统相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//指定拍照之后文件存储路径
Uri uri = Uri.fromFile(new File(path));
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, IMAGE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && requestCode == IMAGE) {
showImage(path);
}
}

//加载图片
private void showImage(String imaePath) {
Bitmap bm = BitmapFactory.decodeFile(imaePath);
((ImageView) findViewById(R.id.image)).setImageBitmap(bm);
}

public String getPath() {
File file = new File(Environment.getExternalStorageDirectory().getPath() + "/wkk");
if (!file.exists() || !file.isDirectory()) {
file.mkdirs();
}
return file.getPath();
}

}

xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="wkk.app3.MainActivity">


<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="点击进行拍照" />


<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />


</LinearLayout>

权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA" />

2016-9-5
另外在项目中集成功能的时候出现了问题,即,在调用相机的时候会将当前页面回收掉,以至于,拍完照之后就返回上一个页面。
即:我在A页面调用startActivityForResult跳转到B页面,然后在B页面调用相机,结果拍完照后,B页面被finish,返回了A页面;这并不是我想要的结果,然后在网上百度,找到了解决方法,给BActivity在manifest中设置属性:

    android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTask"
android:screenOrientation="portrait"

然后重写方法:

    @Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}

网上说时横竖屏的原因,说是三星手机才有,不过那都是比较老的东西了,现在估计很多手机都会有这个东西,我的是魅蓝,也有。
这样设置之后果然有效果了,虽然偶尔还是会出现那种情况。另外这样设置之后,在拍照完成之后activity仍旧 会被回收掉,然后执行A页面的onActivityResult方法,然后再次创建B,所以在B页面返回的时候,A页面的onActivityResult方法不会在执行,所以想要返回Bitmap就没有办法了。因此,我取了个巧,在B页面中设置了一个静态数组data,和一个boolean值,然后在返回的时候,将拍照所的的bitmap转化为数组,赋值给data,在A页面的onResume方法中,判断是否拍照,然后或去到data数组,将其转化为bitmap,然后在将data置空,防止占用内存。

当然如果有更好的方法,欢迎探讨,毕竟静态变量还是少用为好。

另外我在项目中调用相机用的是:

 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 10);

在onActivityResult中接收:

            Bundle bundle1 = data.getExtras();
// 获取相机返回的数据,并转换为Bitmap图片格式,这是缩略图
Bitmap bitmap = (Bitmap) bundle1.get("data");

这里返回的图片是缩略图,不过我也没想这去获取原图,呐,省的自己压缩了。