1. 程式人生 > >android 開發-自定義相機

android 開發-自定義相機

一,呼叫系統相機

    1,用最簡單的方式拍到一張照片返回到當前頁面

        a,在佈局裡新增一個按鈕和imageview,可以通過設定按鈕的onclick 屬性繫結一個方法

        b,在按鈕的繫結方法裡寫如下內容:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQ_1);

            這個intent 可以讓我們跳轉到系統相機的頁面,REQ_1 是自定義的整型變數

        c,在獲得返回值方法裡,新增下面內容,比較簡潔就不做過多解釋:

if (resultCode == RESULT_OK && requestCode == REQ_1) {
    Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");
imageView.setImageBitmap(bitmap);
}

        裡面出現的data 這個名字應該是系統設定的,執行程式就能看到效果,這裡看到的照片實際是真實照片的縮圖

    2, 呼叫系統相機返回一張清晰的照片,思路是:呼叫系統相機時,給出一個照片存放的路徑,拍完後,按照路徑來找到真實的照片。

        a,我們需要提前設定存放照片的路徑

 String imgpath = Environment.getExternalStorageDirectory().getPath();
imgpath = imgpath + "/" + "temp.png";

        b, 開始跳轉,並傳入需要設定的路徑

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri uri = Uri.fromFile(new File(imgpath)); // 用路徑生成一個android 包下的Uri
intent.putExtra(MediaStore.EXTRA_OUTPUT
,uri);// 設定照片儲存路徑 startActivityForResult(intent, REQ_2);

        這一步需要新增訪問sd卡的許可權

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    c,在獲得返回值的方法裡,從路徑讀取照片

FileInputStream   fileInputStream = new FileInputStream(imgpath);
Bitmap bitmap = BitmapFactory.decodeStream(fileInputStream);
imageView.setImageBitmap(bitmap);
    這裡的imgpath 就是一個字串變數,裡面儲存的是之前設定的路徑,這裡因為設計io流,所以需要抓去異常,包圍try/catch就可以了

    然後就可以執行程式試試了,這裡可能存在高的安卓系統出現不相容問題,我在模擬器上可以執行,在手機就會報錯

二,一個自定義的相機,能夠返回一個清晰的照片

        1, 新增基礎元素

            a,在佈局檔案裡,新增surfaceView 佈局,ImageView佈局,一個按鈕

            b,宣告一個Camera物件,並進行例項化

                Camera camera = Camera.open();

            c ,建立一些必要的物件,這裡需要讓activity 實現 SurfaceHolder.Callback介面

private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
            
surfaceView = (SurfaceView)findViewById(R.id.preview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);

            d. 對Camera進行預覽:

camera.setPreviewDisplay(holder);
//將系統camera 預覽角度旋轉90度
camera.setDisplayOrientation(90);
camera.startPreview();

        其中的holder就是上文中的surfaceholder

在按鈕的繫結方法中新增如下內容

Camera.Parameters parameters = camera.getParameters(); // 利用Parameters對相機的引數進行設定
parameters.setPictureFormat(ImageFormat.JPEG); //設定照片格式
Camera.Size size = parametersset(camera); // 這裡利用自定義函式parametersset()獲得相機支援的最大圖片大小
parameters.setPictureSize(size.width,size.height);// 對圖片的大小進行設定,越大則圖片越清晰
parameters.setJpegQuality(100);//設定照片質量,1-100,
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);// 設定照片對焦方式
camera.setParameters(parameters);// 讓相機的物件完成剛才的設定
camera.autoFocus(new Camera.AutoFocusCallback() {
    @Override
public void onAutoFocus(boolean b, Camera camera) {
        if (b){
            camera.takePicture(null,null,pictureCallback);
}
    }
});
public Camera.Size parametersset(Camera camera) { // 獲取相機所支援的最大照片大小
List<Camera.Size> pictureSizes = camera.getParameters().getSupportedPictureSizes();
Camera.Size psize=null;
    for (int i = 0; i < pictureSizes.size(); i++) {
        psize = pictureSizes.get(i);
}
    return psize;
}

這裡面的pictureCallback物件需要提前宣告一下

private Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
    @Override
public void onPictureTaken(byte[] bytes, Camera camera) {
        File file = new File("/sdcard/temp.png");
filepath = file.getAbsolutePath();
        try {
            FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(bytes);
fileOutputStream.close();} catch (FileNotFoundException e) {
            e.printStackTrace();
} catch (IOException e) {
            e.printStackTrace();
}
    }
};

最後還需要在程式終止時對相機進行關閉

    @Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        if( camera !=null) {
            camera.setPreviewCallback(null); // 將相機的回撥置空,取消surfaceview 和相機的關聯操作
camera.stopPreview();//取消相機的取景功能
camera.release();//釋放相機所佔用的系統資源
camera=null;
}
    }
}

再就是許可權設定了

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

相機和sd卡的許可權

到這裡就結束了,如果還不太清楚的可以看我的部落格裡的原始碼,名稱為CameraTest

相關推薦

android 開發-定義相機

一,呼叫系統相機    1,用最簡單的方式拍到一張照片返回到當前頁面        a,在佈局裡新增一個按鈕和imageview,可以通過設定按鈕的onclick 屬性繫結一個方法        b,在按鈕的繫結方法裡寫如下內容:Intent intent = new Int

Android開發-定義Dialog

下面是效果圖 定義一個MyDialog.java工具類繼承Dialog類 具體程式碼如下: /** * Created by WW on 2018/9/12. */ public abstract class MyDialog extends Dialog{ pr

android實現定義相機效果

樓主在進行android開發時用到了自定義攝像頭拍照並將所拍攝的照片轉化成二進位制流輸出這一功能(當然程式裡也附帶將圖片儲存在sd卡里的功能),花了好多天的時間查了很多資料最後終於把它給搞出來了。。。 來~~~直接上圖~~~ 首先先搞出界面佈局來 <?xml version=

Android SurfaceView 定義相機

  時間過的真快,轉眼就要到五一假期,在這裡提前祝大家五一快樂;今天有時間,簡單的寫點最近專案中遇到的坑。具體程式碼我會貼出來,我就不放在GitHub上了,有感興趣的可以去 我的部落格地址 www.softwareboy.com.cn 雖然很醜,但是實

Android開發-定義View-AndroidStudio(六)ViewPager再體驗

轉載請註明出處:http://blog.csdn.net/iwanghang/article/details/53742814覺得博文有用,請點贊,請留言,請關注,謝謝!~直接看GIF效果和程式碼(相對於ViewPager初體驗,添加了當前頁面的點點選中變色效果,以及對應文字

Android開發-定義View-AndroidStudio(五)ViewPager初體驗

轉載請註明出處:http://blog.csdn.net/iwanghang/絕對博文有用,請點贊,請留言,謝謝!~直接看GIF效果和程式碼:MainActivity.java:package com.iwanghang.viewpager; import android.

[Android開發]定義View之TextView區域性操作View-SpanTextView

一、功能效果圖 Android TextView的區域性操作Span封裝View,支援縮略顯示、區域性點選、區域性格式設定、圖片插入替換等等 二、簡單使用 TextView需要區域性操作:點選某些區域性文字的事件、顏色、大小、下劃線、指定位置插入圖片、

Android實現定義相機系列(1)—定義view裁剪控制元件

目標 本系列文章主要記錄自定義相機拍照系列,專案原始碼還在編寫中,後續會傳到github,內容包括: 1、使用Android的Camera API自定義拍照模式,例如人臉拍照,OCR拍照等; 2、對拍完的照片進行裁剪; 3、自定義圖片伸縮view,使用手勢對圖

[Android開發] 定義View之重寫View非常簡單實現開關按鈕SwitchView

一、 效果圖 二、 實現原理 一個View,畫一個圓角矩形,再畫一個圓點就可以了,100行程式碼左右就可以了,不需要圖片。 三、 實現程式碼 為了程式碼不臃腫,只添加了一個設定預設開關的方法,就沒新增設定顏色的方法,如果需要的話自己根據專案在

Android開發-定義application對activity的管理與控制

自定義AppManager,在需要呼叫的地方例項化呼叫。 程式碼如下: /********************************************** * @類名: AppManager * * @描述: 應用程式Activity管理類:用於Acti

Android開發-定義View-AndroidStudio(二十六)數獨(3)Dialog監聽

轉載請註明出處:http://blog.csdn.net/iwanghang/article/details/54290001覺得博文有用,請點贊,請評論,請關注,謝謝!~老規矩,先上GIF動態圖,看個效果,如果符合你的專案或者確定你要了解的內容,再往下看吧:看一下程式碼裡面

Android開發-定義View-AndroidStudio(八)定義View初體驗

轉載請註明出處:http://blog.csdn.net/iwanghang/article/details/53783417覺得博文有用,請點贊,請評論,請關注,謝謝!~老規矩,先上效果圖,看個效果,如果符合你的專案或者確定你要了解的內容,再往下看吧:MainActivit

android使用定義相機避開部分小米手機app呼叫系統相機有水印會轉向的問題

1.需求 我們要求很簡單,就是拍照後顯示效果要橫屏拍的橫著顯示,豎屏拍著豎屏顯示。但是我的手機小米5x等小米型號,存在橫豎使用系統相機拍攝都是橫屏顯示的問題。更慘的是獲取旋轉角度什麼的始終是0,沒辦法棄療使用自定義相機,順便可以去掉系統相機的水印。 簡單歸納

iOS開發-定義相機(仿微信)拍照、視訊錄製

網上有很多自定義相機的例子,這裡只是我臨時寫的一個小demo,僅供參考: 用到了下面幾個庫: #import <AVFoundation/AVFoundation.h> #import <AssetsLibrary/AssetsLibra

開發Android Camera—使用Kotlin語言,完成第一個定義相機

對於首次使用Kotlin語言開發,在網上苦於尋找不到Kotlin語言編寫的相機程式碼,故寫下這篇部落格。 好了,咱們進入主題 在Android 5.0(SDK 21)中,Google使用Camera2替代了Camera介面。Camera2在介面和架構上做了巨大的變動,但是基於眾所周知的原

Android 開發】SufaceView定義相機拍照

前段時間寫了關於一篇關於呼叫系統相機的部落格,如果需要呼叫系統相機和截圖可以看一看這篇部落格:Android學習之呼叫系統相機拍照、截圖並儲存最近發現不同手機,呼叫系統相機效果不太好,,所以學習Android 的相機原理,自定義了一個Android相機。看了這篇部落格,相信

Android多媒體開發 Pro Android Media 第二章 建立定義相機應用 3

擴充套件自定義相機應用程式 在我看來,Android 上的內建相機應用程式缺少幾個基本特徵。其中之一是,延遲一小段時間,10或者30秒,之後進行拍攝。此種功能對於那些可以安裝在三腳架上的相機來說,通常很實用。它提供了這樣的功能,攝影師設定好鏡頭,設定好計時器,然後自己跑到鏡

Android定義相機超詳細講解

了解 catch 實現 4.4 required form 需要 eset 自己 Android自定義相機超詳細講解 轉載請標明出處: http://blog.csdn.net/vinicolor/article/details/49642861; 由於網上關於Andr

android用camera2api定義相機

stream javaweb asp ner servle android avast andro 自定義 js%E5%9F%BA%E7%A1%80%E4%BD%9C%E7%94%A8%E5%9F%9F%E5%92%8C%E9%97%AD%E5%8C%85 javastr

iOS開發筆記17:定義相機拍照

hub 銷毀 用戶 做了 api 交互設計 cap iphone 結果 之前用AVFoundation自定義相機做了拍照與視頻相關的東西,為什麽要自定義呢?主要是提供更個性化的交互設計,符合app主題,對於視頻來說,也便於提供更多豐富有趣的功能。前段時間整理了下拍照部分的功