您好,登錄后才能下訂單哦!
Android中怎么調用Camera,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
首先是布局文件,線性布局,左邊兩個按鈕垂直擺放,右邊預覽圖以及照相獲取到的圖:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <LinearLayout android:layout_width="200dip" android:layout_height="150dip" android:orientation="vertical" > <Button android:id="@+id/btn1" android:layout_width="80dip" android:layout_height="50dip" android:text="Start takPic" /> <Button android:id="@+id/btn2" android:layout_width="80dip" android:layout_height="50dip" android:text="Get Pic" /> </LinearLayout> <LinearLayout android:id="@+id/cameraView" android:layout_width="200dip" android:layout_height="150dip" android:orientation="vertical" > </LinearLayout> </LinearLayout>
代碼,都寫在一起的。包含一個自定義的surfaceView(用于相機的照相預覽).以及activit:
package com.nico;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
public class Test extends Activity implements OnClickListener {
/** Called when the activity is first created. */
// camera 類
private Camera camera = null;
// 繼承surfaceView的自定義view 用于存放照相的圖片
private CameraView cv = null;
// 回調用的picture,實現里邊的onPictureTaken方法,其中byte[]數組即為照相后獲取到的圖片信息
private Camera.PictureCallback picture = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// 主要就是將圖片轉化成drawable,設置為固定區(qū)域的背景(展示圖片),當然也可以直接在布局文件里放一個surfaceView供使用。
ByteArrayInputStream bais = new ByteArrayInputStream(data);
Drawable d = BitmapDrawable.createFromStream(bais, Environment
.getExternalStorageDirectory().getAbsolutePath()
+ "/img.jpeg");
l.setBackgroundDrawable(d);
try {
} catch (Exception e) {
e.printStackTrace();
}
}
};
// 按鈕 布局等定義,不作贅述
Button btn1 = null;
Button btn2 = null;
LinearLayout l = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
setContentView(R.layout.main);
l = (LinearLayout) findViewById(R.id.cameraView);
btn1 = (Button) findViewById(R.id.btn1);
btn2 = (Button) findViewById(R.id.btn2);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
}
//主要的surfaceView,負責展示預覽圖片,camera的開關
class CameraView extends SurfaceView {
//
private SurfaceHolder holder = null;
public CameraView(Context context) {
super(context);
holder = this.getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
Camera.Parameters parameters = camera.getParameters();
//以下注釋掉的是設置預覽時的圖像以及拍照的一些參數
// parameters.setPictureFormat(PixelFormat.JPEG);
// parameters.setPreviewSize(parameters.getPictureSize().width,
// parameters.getPictureSize().height);
// parameters.setFocusMode("auto");
// parameters.setPictureSize(width, height);
camera.setParameters(parameters);
camera.startPreview();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
try {
//設置camera預覽的角度,因為默認圖片是傾斜90度的
camera.setDisplayOrientation(90);
//設置holder主要是用于surfaceView的圖片的實時預覽,以及獲取圖片等功能,可以理解為控制camera的操作..
camera.setPreviewDisplay(holder);
} catch (IOException e) {
camera.release();
camera = null;
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//顧名思義可以看懂
camera.stopPreview();
camera.release();
camera = null;
}
});
// holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
}
@Override
public void onClick(View v) {
if (v == btn1) {
l.removeAllViews();
cv = new CameraView(Test.this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT);
l.addView(cv, params);
} else if (v == btn2) {
camera.takePicture(null, null, picture);
}
}
}
看完上述內容,你們掌握Android中怎么調用Camera的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。