1、通過調用系統的照相機實現照相功能
1)將拍照的圖片存到本地文件,然後再讀取顯示
public class MainActivity extends Activity {
private Button btn;
private ImageView iv;
private File file = null;
private static final int REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
iv = (ImageView) findViewById(R.id.iv);
// 設置按鈕單擊事件
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 在sdcard卡中創建一個文件夾,要獲取相應的權限
File dir = new File(Environment.getExternalStorageDirectory(),
"pictures");
if (!dir.exists()) {
dir.mkdir();
}
file = new File(dir, System.currentTimeMillis() + ".jpg");
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
// 調用系統的照相機
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(i, REQUEST_CODE);
}
});
}
// 獲取Activity返回結果的方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CODE:
iv.setImageURI(Uri.fromFile(file));
break;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
}
2)直接讀取拍照的數據,並且顯示
public class Main extends Activity implements OnClickListener
{
private ImageView imageView;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnTakePicture = (Button)findViewById(R.id.btnTakePicture);
btnTakePicture.setOnClickListener(this);
imageView = (ImageView)findViewById(R.id.imageview);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(requestCode == 1)
{
if(resultCode == Activity.RESULT_OK)
{
Bitmap cameraBitmap = (Bitmap)data.getExtras().get("data");
imageView.setImageBitmap(cameraBitmap);
}
}
}
public void onClick(View view)
{
Intent intent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
}
}
相應的佈局文件:
<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" >
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="開始拍照" />
</LinearLayout>
2、通過調用Camera類實現照相功能
要使用照相機,需要獲取相應的權限<uses-permission android:name="android.permission.CAMERA" />
public class MainActivity extends Activity {
private SurfaceView sv;
private Camera camera;// 照相機對象
private Button btn;// 照相按鈕
private Callback callback = new Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
stopPreview();
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
startPreview();
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
int arg3) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sv = (SurfaceView) findViewById(R.id.sv);
sv.getHolder().addCallback(callback);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// 照相機拍照
camera.takePicture(null, null, new Camera.PictureCallback() {
// 拍完照片後的回調方法
@Override
public void onPictureTaken(byte[] data, Camera camera) {
String path = null;
if ((path = saveFile(data)) != null) {
Intent i = new Intent(MainActivity.this,
ImagePreviewActivity.class);
i.putExtra("path", path);
startActivity(i);
} else {
// 保存文件失敗
Toast.makeText(MainActivity.this, "保存照片失敗!",
Toast.LENGTH_SHORT).show();
}
}
});
}
});
}
// 開始預覽
private void startPreview() {
// 打開照相機
camera = Camera.open();
try {
camera.setPreviewDisplay(sv.getHolder());
camera.setDisplayOrientation(90);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
// 結束預覽
private void stopPreview() {
camera.stopPreview();
camera.release();
}
// 保存照片的方法
private String saveFile(byte[] bytes) {
try {
// createTempFile()在android 4.x版本後默認的存儲路徑爲:/data/data/應用包名/cache
// 而之前的版本該方法會把文件存儲在sd上
File f = File.createTempFile("img", "");
FileOutputStream fos = new FileOutputStream(f);
fos.write(bytes);
fos.flush();
fos.close();
return f.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
public class ImagePreviewActivity extends Activity {
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
iv = new ImageView(this);
setContentView(iv);
// 獲取圖片的路徑
String path = getIntent().getStringExtra("path");
if (path != null) {
// 顯示圖片
iv.setImageURI(Uri.fromFile(new File(path)));
}
}
}
相應的佈局文件:
<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" >
<SurfaceView
android:id="@+id/sv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="拍照" />
</LinearLayout>