android實現(xiàn)簡單拍照功能
拍照可以調(diào)用系統(tǒng)的相機進行拍照,拍完保存到相應(yīng)的SD卡目錄。最近要用到拍照這個功能,首先試了下調(diào)用相機拍照,保存到相應(yīng)目錄,然后用imageview顯示的時候感覺,很模糊??赡苁菆D片被壓縮的太狠了。所以自己使用Camera寫了一個拍照的功能,拍出來的還挺清晰的,不過文件有點大一張圖片差不多1.7M。如果想拍高清圖可以使用下面的代碼。
代碼很簡單,我就不做過多解釋了。
package com.example.testsimple;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private Camera camera;
private File picture;
private Button btnSave;
private final static String TAG = "CameraActivity";
private ImageView open_picIcon;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* Intent intent=new Intent(MainActivity.this,MyCameraActivity.class);
startActivity(intent);
finish();*/
setupViews();
}
private void setupViews(){
surfaceView = (SurfaceView) findViewById(R.id.camera_preview); // Camera interface to instantiate components
surfaceHolder = surfaceView.getHolder(); // Camera interface to instantiate components
surfaceHolder.addCallback(surfaceCallback); // Add a callback for the SurfaceHolder
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
btnSave = (Button) findViewById(R.id.save_pic);
open_picIcon=(ImageView) findViewById(R.id.open_picIcon);
btnSave.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
surfaceView.setVisibility(View.VISIBLE);
open_picIcon.setVisibility(View.GONE);
takePic();
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_CAMERA
|| keyCode == KeyEvent.KEYCODE_SEARCH) {
takePic();
return true;
}
return super.onKeyDown(keyCode, event);
}
private void takePic() {
camera.stopPreview();// stop the preview
camera.takePicture(null, null, pictureCallback); // picture
}
// Photo call back
Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
//@Override
public void onPictureTaken(byte[] data, Camera camera) {
new SavePictureTask().execute(data);
camera.startPreview();
}
};
// save pic
class SavePictureTask extends AsyncTask<byte[], String, String> {
@Override
protected String doInBackground(byte[]... params) {
String fname = DateFormat.format("yyyyMMddhhmmss", new Date()).toString()+".jpg";
Log.i(TAG, "fname="+fname+";dir="+Environment.getExternalStorageDirectory());
//picture = new File(Environment.getExternalStorageDirectory(),fname);// create file
picture = new File(Environment.getExternalStorageDirectory()+"/images/"+fname);
File file= picture.getParentFile();
if(!file.exists())
file.mkdir();
try {
FileOutputStream fos = new FileOutputStream(picture.getPath()); // Get file output stream
fos.write(params[0]); // Written to the file
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Bitmap bitmap=getDiskBitmap(picture.getPath());
surfaceView.setVisibility(View.GONE);
open_picIcon.setVisibility(View.VISIBLE);
open_picIcon.setImageBitmap(bitmap);
}
}
private Bitmap getDiskBitmap(String pathString)
{
Bitmap bitmap = null;
try
{
File file = new File(pathString);
if(file.exists())
{
bitmap = BitmapFactory.decodeFile(pathString);
}
} catch (Exception e)
{
// TODO: handle exception
}
return bitmap;
}
// SurfaceHodler Callback handle to open the camera, off camera and photo size changes
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
Log.i(TAG, "surfaceCallback====");
camera = Camera.open(); // Turn on the camera
try {
camera.setPreviewDisplay(holder); // Set Preview
} catch (IOException e) {
camera.release();// release camera
camera = null;
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Log.i(TAG,"====surfaceChanged");
Camera.Parameters parameters = camera.getParameters(); // Camera parameters to obtain
parameters.setPictureFormat(PixelFormat.JPEG);// Setting Picture Format
// parameters.set("rotation", 180); // Arbitrary rotation
camera.setDisplayOrientation(0);
parameters.setPreviewSize(400, 300); // Set Photo Size
camera.setParameters(parameters); // Setting camera parameters
camera.startPreview(); // Start Preview
}
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i(TAG,"====surfaceDestroyed");
camera.stopPreview();// stop preview
camera.release(); // Release camera resources
camera = null;
}
};
}
拍完以后自動保存到SD卡中的images目錄下

下面是圖片存放路徑

1.8M 確實有點大,不過是高清圖片
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。
- Android打開系統(tǒng)相機并拍照的2種顯示方法
- Android如何調(diào)用系統(tǒng)相機拍照
- Android 系統(tǒng)相機拍照后相片無法在相冊中顯示解決辦法
- 適配AndroidQ拍照和讀取相冊圖片的實現(xiàn)方法
- Android實現(xiàn)靜默拍照功能
- Android快速實現(xiàn)無預(yù)覽拍照功能
- Android 拍照選擇圖片并上傳功能的實現(xiàn)思路(包含權(quán)限動態(tài)獲取)
- Android 自定義view仿微信相機單擊拍照長按錄視頻按鈕
- android 7自定義相機預(yù)覽及拍照功能
- Android使用系統(tǒng)相機進行拍照的步驟
相關(guān)文章
Kotlin 封裝萬能SharedPreferences存取任何類型詳解
這篇文章主要介紹了Kotlin 封裝萬能SharedPreferences存取任何類型詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05
android應(yīng)用開發(fā)之spinner控件的簡單使用
Android的控件有很多種,其中就有一個Spinner的控件,這個控件其實就是一個下拉顯示列表。本文通過腳本之家平臺給大家介紹android應(yīng)用開發(fā)之spinner控件的簡單使用,感興趣的朋友可以參考下2015-11-11
Flutter加載圖片流程MultiFrameImageStreamCompleter解析
這篇文章主要為大家介紹了Flutter加載圖片流程MultiFrameImageStreamCompleter示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04
android TextView設(shè)置中文字體加粗實現(xiàn)方法
android TextView設(shè)置中文字體加粗如何實現(xiàn),接下來介紹實現(xiàn)方法,有需要的朋友可以參考下2013-01-01
Android中Service和Activity相互通信示例代碼
在android中Activity負責前臺界面展示,service負責后臺的需要長期運行的任務(wù)。下面這篇文章主要給大家介紹了關(guān)于Android中Service和Activity相互通信的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09
Android 7.0 運行時權(quán)限彈窗問題的解決
這篇文章主要介紹了Android 7.0 運行時權(quán)限彈窗問題的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2020-03-03

