A. android中用Camera來調用攝像頭,只能用takePicture來拍照嗎
代碼與範例:
首先需要在Manifest文件中添加以下內容:運昌
以使程序獲取攝像頭使用以及自動對焦功能的使用許可權。
CameraTestActivity.java
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
public class CameraTestActivity extends Activity {
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE); 設置橫屏模式以及全屏模式
setContentView(new CameraView(this)); 設置View
}
}
CameraView.java
import java.io.FileOutputStream;
import android.content.Context;
import android.hardware.Camera;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class CameraView extends SurfaceView implements SurfaceHolder.Callback, Camera.PictureCallback {
private SurfaceHolder holder;
private Camera camera;
private boolean af;
public CameraView(Context context) {構造函數
super(context);
holder = getHolder();生成Surface Holder
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);指定Push Buffer
}
public void surfaceCreated(SurfaceHolder holder) {Surface生成事件的處理
try {
camera = Camera.open();攝像頭的初始化
camera.setPreviewDisplay(holder);
} catch (Exception e) {
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {Surface改變事件的處理
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(width, height);
camera.setParameters(parameters);設置參數
camera.startPreview();開始預覽
}
public void surfaceDestroyed(SurfaceHolder holder) {Surface銷毀時宏鏈的處理
camera.setPreviewCallback(null);
camera.sPreview();
camera.release();
camera =null;
}
@Override
public boolean onTouchEvent(MotionEvent event) {屏幕觸摸事件
if (event.getAction() == MotionEvent.ACTION_DOWN) {按下時自動對焦
camera.autoFocus(null);
af =true;
}
if (event.getAction() == MotionEvent.ACTION_UP && af ==true) {放開後拍照
camera.takePicture(null, null, this);
af =false;
}
returntrue;
}
public void onPictureTaken(byte[] data, Camera camera) {拍攝完成後保存照片
try {
String path = Environment.getExternalStorageDirectory() +"/test.jpg";
data2file(data, path);
} catch (Exception e) {
}
camera.startPreview();
}
private void data2file(byte[] w, String fileName) throws Exception {將二進制數據轉換為文件的函數
FileOutputStream out =null;
try {
out =new FileOutputStream(fileName);
out.write(w);
out.close();
} catch (Exception e) {
if (out !=null)
out.close();
throw e;
}
}
}
在Android開發過程中,有時需要調用手機自身設備的功能,本文側重攝像頭拍照功能的調用。
:blog.csdn./mahoking/article/details/28225907
我們要調用攝像頭的拍照功能,顯然
第一步必須加入調用攝像頭硬體的許可權,拍完照後我們要將圖片保存在SD卡中,必須加入SD卡讀寫許可權,所以第一步,我們應該在Android清單文件中加入以下代碼
<uses-permission android:name="android.permission.CAMERA"/>攝像頭許可權
SD卡讀寫許可權
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
第二步,要將攝像頭捕獲的圖像實時地顯示在手機上。
我們是用SurfaceView這個視圖組件來實現的,因此在main.xml中加入下列代碼
<SurfaceView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/surfaceview"
/>
第三步,設置窗口的顯示方式
首先獲得當前窗口Windowwindow = getWindow();得到窗口
接著設置沒有標題requestWindowFeature(Window.FEATURE_NO_TITLE);沒有標題
接著設置全屏 window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);設置全屏
當然,我們在拍照過程中,屏幕必須一致處於高亮狀態,因此接著加入下面代碼
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);設置高亮
至此,我們將窗口的顯示方式規定死了,然後才能設置窗口上顯示的組件(順序非常重要)
setContentView(R.layout.main);
第四步,設置SurficeView顯示控制項的屬性
找到surficeView
surfaceView = (SurfaceView)findViewById(R.id.surfaceview);
設置它的像素為800x600
surfaceView.getHolder().setFixedSize(800,480);
下面設置surfaceView不維護自己的緩沖區,而是等待屏幕的渲染引擎將內容推送到用戶面前
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
第五步,就是為surficeView加入回調方法(callBack)
surfaceView.getHolder().addCallback(newSurfaceCallback());
上面的回調類是我們自己定義的,代碼如下
private class SurfaceCallback implementsSurfaceHolder.Callback{
@Override
public void surfaceCreated(SurfaceHolderholder) {
try {
camera = Camera.open();打開硬體攝像頭,這里導包得時候一定要注意是android.hardware.Camera
WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);得到窗口管理器
Display display = wm.getDefaultDisplay();得到當前屏幕
Camera.Parameters parameters =camera.getParameters();得到攝像頭的參數
parameters.setPreviewSize(display.getWidth(),display.getHeight());設置預覽照片的大小
parameters.setPreviewFrameRate(3);設置每秒3幀
parameters.setPictureFormat(PixelFormat.JPEG);設置照片的格式
parameters.setJpegQuality(85);設置照片的質量
parameters.setPictureSize(display.getHeight(),display.getWidth());設置照片的大小,默認是和屏幕一樣大
camera.setParameters(parameters);
camera.setPreviewDisplay(surfaceView.getHolder());通過SurfaceView顯示取景畫面
camera.startPreview();開始預覽
isPreview = true;設置是否預覽參數為真
} catch (IOException e) {
Log.e(TAG, e.toString());
}
}
@Override
public void surfaceChanged(SurfaceHolderholder, int format, int width,
int height) {
TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolderholder) {
if(camera!=null){
if(isPreview){如果正在預覽
camera.sPreview();
camera.release();
}
}
}
}
第六步,我們必須對按鍵事件進行監聽,如是拍照還是聚焦,代碼如下
public boolean onKeyDown(int keyCode,KeyEvent event) {處理按鍵事件
if(camera!=null&&event.getRepeatCount()==0)代表只按了一下
{
switch(keyCode){
case KeyEvent.KEYCODE_BACK:如果是搜索鍵
camera.autoFocus(null);自動對焦
break;
case KeyEvent.KEYCODE_DPAD_CENTER:如果是中間鍵
camera.takePicture(null, null, new TakePictureCallback());將拍到的照片給第三個對象中,這里的TakePictureCallback()是自己定義的,在下面的代碼中
break;
}
}
return true;阻止事件往下傳遞,否則按搜索鍵會變成系統默認的
}
------------------------------------------------------------------------------------------
private final class TakePictureCallbackimplements PictureCallback{
public void onPictureTaken(byte[] data,Camera camera) {
try {
Bitmap bitmap =BitmapFactory.decodeByteArray(data, 0, data.length);
File file = newFile(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
FileOutputStream outputStream = newFileOutputStream(file);
bitmap.press(CompressFormat.JPEG, 100,outputStream);
outputStream.close();
camera.sPreview();
camera.startPreview();處理完數據之後可以預覽
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
}
注意,代碼中有兩個回調類,一個是SurfaceCallback(),另外一個是TakePictureCallback(),初學者可能一時難以理解,通俗地講,前者是用來監視surficeView這個暫時存放圖片數據的顯示控制項的,根據它的顯示情況調用不同的方法,包括surfaceCreated(),surfaceChanged(),surfaceDestroyed(),也就不難理解為什麼會有這三個回調方法了(注意,在surfaceDestroyed()方法中必須釋放攝像頭,詳細代碼參見上方)。TakePictureCallback()是為了監視是否拍照而設計的介面,期中也僅有一個方法,camera將拍照得到的數據傳入方法,我們便可以對拍照得到的數據進行進一步處理
您好!
不能使用主攝像頭提示什麼呢,請你具體描述一下,以便我們更好的為您解答。
如果有任何問題可以隨時來咨詢我們的。非常感謝您對我們vivo的支持,祝您生活愉快!
有的不帶盤的攝像頭是免驅的,只要XP_SP2就會自認,另外你可以搜搜PC-CAMERA的萬能驅動,不行的話還是老實點用盤裝
刷機包有問題,你先下載個別的相機看看能不能切換攝像頭,或是有沒有相關的相機補丁,不行的話你再刷回來就好了。
尊貴的用戶,您好:
很抱歉給您帶來疑惑了。若您需要切換前後置攝像頭,可進入主菜單--相機--點擊「+」後面的小相機圖標即可切換,請您嘗試。
若如果您嘗試,沒有該切換圖標,建議到系統設置--應用程序--拍照--清除數據後試試,同時您也可以下載第三方拍照軟體進行嘗試,若使用第三方軟體也會出現該情況,建議您備份下資料,恢復出廠設置後進行嘗試,若依然不行,可抽空帶上保修卡或發票聯系當地的維修站點檢測處理。
官網授權維修站點查詢::support1.lenovo../lenovo/wsi/station/servicestation。
感謝您對聯想的支持,祝您生活愉快!
這個問題和java語言本身沒啥關系。首先看你是用什麼讀取的攝像頭來獲得照片。
比如說你用flash來讀取攝像頭獲得照片,那麼有相關的api獲得攝像頭列表(此時的攝像頭列表是全部的,包括虛擬攝像頭的)
但是,你可以讀取本地真實的攝像頭(bs模式請用ocs控制項讀取,讀取方式參照System.ManagementObject),然後比較真實的攝像頭和現在正在拍照使用的攝像頭即可。
真實實踐過 望採納。
打開「我的電腦」
下面應該有個「掃描儀和照相機」
打開你的照相機就可以拍照了
你可以把手機重啟一下試試。
或者你可以從應用寶裡面下載個第三方拍照軟體。然後拍照看看怎麼樣。
或者你恢復出廠設置。應該會好很多的。也有可能是你攝像損毀了。
B. Android開發怎麼調用攝像頭功能
1、現在Android智能手機的像素都會提供照相的功能,大部分的手機的攝像頭的像素都在1000萬以上的像素,有的甚至會更高。它們大多都會支持光學變焦、曝光以及快門等等。下面的程序Demo實例示範了使用Camera v2來進行拍照,當用戶按下拍照鍵時,該應用會自動對焦,當對焦成功時拍下照片。layout/activity_main.xml界面布局代碼如下:
3、接來了的MainActivity.java程序將會使用CameraManager來打開CameraDevice,並通過CameraDevice創建CameraCaptureSession,然後即可通過CameraCaptureSession進行預覽或拍照了。