日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android 自定义相机源码,Android 自定义相机及分析源码

發布時間:2023/12/10 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 自定义相机源码,Android 自定义相机及分析源码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android 自定義相機及分析源碼

使用Android 系統相機的方法:

要想讓應用有相機的action,咱們就必須在清單文件中做一些聲明,好讓系統知道,如下

action的作用就是聲明action的類型,便于Intent的使用,category的作用就是注冊,沒有它。相關操作將不起作用。

一種方式是簡單粗暴的實現,如下

Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

startActivityForResult(intent, REQ_1);

//然后在 onActivityResult方法中實現數據的獲取,此處是展示在了一個ImageView上

if(resultCode==RESULT_OK){

if(requestCode==REQ_1){

Bundle bundle=data.getExtras();

Bitmap bitmap=(Bitmap) bundle.get("data");

imageView.setImageBitmap(bitmap);

}

小總結:這樣的好處是簡單快捷,但是在現在的android智能機中,好多相片都是很大的,這里獲得的僅僅是一個縮略圖罷了

另外一種方式是稍微溫婉一點了,而且效果也更好一點,好處就在于它是先將照片信息存儲到本地一個臨時文件中,然后讓ImageView去相關路徑下進行讀取,這樣就可以獲得清晰度很高的圖片了。如下

/*

* 此方法的存在意義就是不在onActivityResult方法的data中獲取我們拍照的縮略圖,而是從我們的文件輸出目錄下直接查看原圖

* 這樣的好處就是可以對大容量的照片進行便捷的準確的操作

*/

public void onStartCarema2(View view){

Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

//見你給你路徑傳遞回需要的處理方法中

Uri uri=Uri.fromFile(new File(myFilePath));

//設置文件的輸出路徑

intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

startActivityForResult(intent, REQ_2);

}

//然后在onActivityResult方法中進行相關的處理就可以了

else if(requestCode==REQ_2){

FileInputStream fis=null;

try {

fis=new FileInputStream(myFilePath);

Bitmap bitmap=BitmapFactory.decodeStream(fis);

imageView.setImageBitmap(bitmap);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

try {

fis.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

//記得最后一定要關閉相關的流操作。否則會引起相關的異常的。

開發自定義的相機

由于開發自定義的相機要進行相關的權限的生命,所以一定不要忘記在清單文件中做相關的處理,如下

然后有以下幾個步驟:

創建Camera,并完成初始化Camera,開始預覽,釋放資源三個方法

與Activity的SurfaceView進行綁定。

在系統的onPause(),onResume()方法中進行相關狀態設置

對Camera進行參數設置,作用就是對照片類型和狀態進行相關的設置

將拍得的照片進行展示,一般會新開一個Activity,用ImageView進行承載,我們還可以在此Activity上添加TextView,實現水印效果等其他的美化操作

另外,如果想加入自動聚焦的功能,就可以在SurfaceView上添加onClickListener(),對屏幕進行偵聽,調用myCamera.autoFocus(null);方法即可

以上就是整個思路

接下來就是使用系統Camera的代碼展示

(可以直接copy相關代碼塊,添加到你的應用中去,實現Camera這一功能。)

首先是MainActivity

布局

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:orientation="vertical"

tools:context=".MainActivity" >

android:id="@+id/startCarema"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_margin="6dp"

android:text="StartCarema"

android:onClick="onStartCarema"

/>

android:id="@+id/startCarema2"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_margin="6dp"

android:text="StartCarema2"

android:onClick="onStartCarema2"

/>

android:id="@+id/customCarema"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_margin="6dp"

android:text="CustomCarema"

android:onClick="onCustomCarema"

/>

android:id="@+id/imageview"

android:layout_width="match_parent"

android:layout_height="match_parent"

/>

代碼

package com.example.camerademo;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

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.view.View;

import android.widget.Button;

import android.widget.ImageView;

public class MainActivity extends Activity {

//為下面的獲取請求所用

private static int REQ_1=1;

private static int REQ_2=2;

Button btn_startCareme,btn_startCarema2,btn_customCarema;

ImageView imageView;

//定義照片存儲的路徑

private String myFilePath;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btn_startCareme=(Button) findViewById(R.id.startCarema);

btn_startCarema2=(Button) findViewById(R.id.startCarema2);

btn_customCarema=(Button) findViewById(R.id.customCarema);

imageView=(ImageView) findViewById(R.id.imageview);

//初始化不同手機的SD卡的路徑

myFilePath=Environment.getExternalStorageDirectory().getPath();

myFilePath=myFilePath+"/"+"temperature.png";

}

public void onCustomCarema(View view){

Intent intent=new Intent(this,CustomCarema.class);

startActivity(intent);

}

public void onStartCarema(View view){

Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

startActivityForResult(intent, REQ_1);

}

/*

* 此方法的存在意義就是不在onActivityResult方法的data中獲取我們拍照的縮略圖,而是從我們的文件輸出目錄下直接查看原圖

* 這樣的好處就是可以對大容量的照片進行便捷的準確的操作

*/

public void onStartCarema2(View view){

Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

//見你給你路徑傳遞回需要的處理方法中

Uri uri=Uri.fromFile(new File(myFilePath));

//設置文件的輸出路徑

intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

startActivityForResult(intent, REQ_2);

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

// TODO Auto-generated method stub

super.onActivityResult(requestCode, resultCode, data);

if(resultCode==RESULT_OK){

if(requestCode==REQ_1){

Bundle bundle=data.getExtras();

Bitmap bitmap=(Bitmap) bundle.get("data");

imageView.setImageBitmap(bitmap);

}else if(requestCode==REQ_2){

FileInputStream fis=null;

try {

fis=new FileInputStream(myFilePath);

Bitmap bitmap=BitmapFactory.decodeStream(fis);

imageView.setImageBitmap(bitmap);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

try {

fis.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

}

}

接下來是自定義相機的代碼

主界面布局

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/capture"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_margin="6dp"

android:text="Capture"

android:onClick="onCapture"

/>

android:id="@+id/preview"

android:layout_width="match_parent"

android:layout_height="match_parent"

/>

ResultActivity的布局

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="Capture Result"

android:textSize="28dp"

android:textColor="#BFAACD"

android:gravity="center"

/>

android:id="@+id/picture"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:scaleType="center"

/>

代碼

首先是CustomCamera類,

package com.example.camerademo;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import android.app.Activity;

import android.content.Intent;

import android.graphics.ImageFormat;

import android.hardware.Camera;

import android.os.Bundle;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

@SuppressWarnings("unused")

public class CustomCarema extends Activity implements SurfaceHolder.Callback{

private Camera myCamera;

private SurfaceView preview;

private SurfaceHolder myHolder; //myHolder勇于展現surfaceView的圖像

private Camera.PictureCallback myPictureCallBack=new Camera.PictureCallback() {

@Override

public void onPictureTaken(byte[] data, Camera arg1) {

//將拍照得到的數據信息存儲到本地

File tempFile=new File("/sdcard/temp.png");

try {

FileOutputStream fos=new FileOutputStream(tempFile);

fos.write(data);

fos.close();

//然后將這個照片的數據信息傳送給要進行展示的Activity即可

Intent intent=new Intent(CustomCarema.this,ResultActivity.class);

intent.putExtra("PicturePath", tempFile.getAbsolutePath());

startActivity(intent);

//拍照結束之后銷毀當前的Activity,進入到圖片展示界面

CustomCarema.this.finish();

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.customcarema);

preview=(SurfaceView) findViewById(R.id.preview);

myHolder=preview.getHolder();

myHolder.addCallback(this);

//實現點擊屏幕自動聚焦的功能,此處并不需要拍照,故只是聚焦

preview.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) {

// TODO Auto-generated method stub

myCamera.autoFocus(null);

}

});

}

@Override

protected void onResume() {

super.onResume();

if(myCamera==null){

myCamera=getCamera();

if(myHolder != null ){

setStartPreview(myCamera, myHolder);

}

}

}

@Override

protected void onPause() {

// TODO Auto-generated method stub

super.onPause();

releaseCamera();

}

/**

* 釋放相機的資源

*/

private void releaseCamera(){

if(myCamera !=null ){

myCamera.setPreviewCallback(null);

myCamera.stopPreview();

myCamera.release();

myCamera=null;

}

}

/**

* 拍照的一些參數設置,點擊此按鈕之后會觸發拍照的會掉,進而實現拍照的效果

* @param view

*/

public void onCapture(View view){

Camera.Parameters parameters=myCamera.getParameters();

//設置照片的類型

parameters.setPictureFormat(ImageFormat.JPEG);

parameters.setPictureSize(800, 600);

//設置為自動聚焦

parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

//設置為自動聚焦是不夠的,因為我們先得到的是最為清晰的圖片,所以要在聚焦成功的時候才進行拍照

myCamera.autoFocus(new Camera.AutoFocusCallback() {

@Override

public void onAutoFocus(boolean success, Camera camera) {

// TODO Auto-generated method stub

if(success){

myCamera.takePicture(null, null, myPictureCallBack);

}

}

});

}

/**

* 獲取系統的一個Camera對象

*/

private Camera getCamera(){

Camera camera=null;

try{

camera=Camera.open();

}catch(Exception e){

e.printStackTrace();

}

return camera;

}

/**

* 開始預覽相機的內容,其實就是講surfaceHolder與之綁定

*/

private void setStartPreview(Camera camera,SurfaceHolder holder){

//直接調用系統方式綁定預覽

try {

camera.setPreviewDisplay(holder);

//由于系統默認使用橫屏預覽,,所以要進行設置

camera.setDisplayOrientation(90);

camera.startPreview();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

@Override

public void surfaceChanged(SurfaceHolder holder, int arg1, int arg2, int arg3) {

// TODO Auto-generated method stub

myCamera.stopPreview();

setStartPreview(myCamera, myHolder);

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

// TODO Auto-generated method stub

setStartPreview(myCamera, myHolder);

}

@Override

public void surfaceDestroyed(SurfaceHolder arg0) {

// TODO Auto-generated method stub

releaseCamera();

}

}

然后是結果界面代碼:

package com.example.camerademo;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Matrix;

import android.os.Bundle;

import android.widget.ImageView;

public class ResultActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.resultactivity);

String path=getIntent().getStringExtra("PicturePath");

ImageView imageview=(ImageView) findViewById(R.id.picture);

//由于這樣稚嫩獲得橫屏,所以我們要使用流的形式來轉換

// Bitmap bitmap=BitmapFactory.decodeFile(path);

// imageview.setImageBitmap(bitmap);

FileInputStream fis;

try {

fis = new FileInputStream(path);

Bitmap bitmap=BitmapFactory.decodeStream(fis);

Matrix matrix=new Matrix();

matrix.setRotate(90);

bitmap=Bitmap.createBitmap(bitmap, 0,0, bitmap.getWidth()

,bitmap.getHeight(),matrix,true);

imageview.setImageBitmap(bitmap);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

以上代碼中已經做了下關的代碼注釋

總結:

安卓6.0以上版本記得加動態權限,不然會報空指針哦,還有點擊拍照事件那里? 別忘了加進去,不然拍照沒反應

以上就是Android 自定義相機的實例詳解,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

總結

以上是生活随笔為你收集整理的android 自定义相机源码,Android 自定义相机及分析源码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。