Android相機(jī)開(kāi)發(fā)

Android相機(jī)開(kāi)發(fā)

推薦幾個(gè)好的圖片選擇+拍照的框架
bilibili/boxing
LuckSiege/PictureSelector5900多個(gè)star
jeasonlzy/ImagePicker3600多個(gè)star
sucese/phoenix有Camera1和Camera2使用
只有相機(jī)功能
CameraKit/camerakit-android3900多個(gè)star
natario1/CameraView自由度很高的相機(jī)

申請(qǐng)權(quán)限

<uses-permission android:name="android.permission.CAMERA" />
<!--可以防止APP被安裝到?jīng)]有相機(jī)的Android設(shè)備上(目前僅Google Play支持)-->
<uses-feature android:name="android.hardware.camera" />

動(dòng)態(tài)權(quán)限不要忘了

創(chuàng)建一個(gè)可以預(yù)覽的界面

1.創(chuàng)建一個(gè)新工程

2.在新創(chuàng)建的工程中activity中布局文件

<FrameLayout
    android:id="@+id/preview_f"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

3.創(chuàng)建一個(gè)相機(jī)預(yù)覽的view 繼承SurfaceView

最新都開(kāi)始用TextureView,關(guān)于SurfaceView/TextureView

  • SurfaceView是一個(gè)有自己Surface的View中跌。界面渲染可以放在單獨(dú)線程而不是主線程中。它更像是一個(gè)Window菇篡,自身不能做變形和動(dòng)畫(huà)漩符。
  • TextureView同樣也有自己的Surface。但是它只能在擁有硬件加速層層的Window中繪制驱还,它更像是一個(gè)普通View嗜暴,可以做變形和動(dòng)畫(huà)凸克。

更多關(guān)于SurfaceView與TextureView區(qū)別的內(nèi)容可以參考這篇文章Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView.

官方給出的方案闷沥,圖片來(lái)自于Android平臺(tái)Camera開(kāi)發(fā)實(shí)踐指南:

官方給出的方案
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

    private final SurfaceHolder mHolder;
    private Camera mCamera;

    public CameraPreview(Context context) {
        super(context);
        mHolder = getHolder();
        mHolder.addCallback(this);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        //surface第一次創(chuàng)建時(shí)回調(diào)
        //打開(kāi)相機(jī)
        mCamera = Camera.open();
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        //surface變化的時(shí)候回調(diào)(格式/大小)
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        //surface銷(xiāo)毀的時(shí)候回調(diào)
        mHolder.removeCallback(this);
        mCamera.setPreviewCallback(null);
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }
}

4.在activity中添加

public class MainActivity extends AppCompatActivity {

    private FrameLayout mFrameLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initCamera();
    }

    private void initCamera() {
        CameraPreview preview = new CameraPreview(this);
        mFrameLayout.addView(preview);
    }

    private void initView() {
        mFrameLayout = (FrameLayout) findViewById(R.id.preview_f);
    }
}

至此可以顯示一個(gè)相機(jī)界面萎战,并有圖像顯示。

添加偏好設(shè)置

如分辨率舆逃、閃光燈蚂维、對(duì)焦等。

通過(guò)當(dāng)前界面的相機(jī)camera對(duì)象獲取起設(shè)置的參數(shù)getParameters()

預(yù)覽分辨率

  • parameters.getSupportedPreviewSizes()獲取相機(jī)支持的所有預(yù)覽分辨率

預(yù)覽格式

具體參照ImageFormat或者自己Google

  • parameters.getSupportedPreviewFormats()獲取相機(jī)支持的所有預(yù)覽格式

照片分辨率

  • parameters.getSupportedPictureSizes()獲取相機(jī)支持的所有圖片分辨率

圖片格式

具體參照ImageFormat或者自己Google

  • parameters.getSupportedPictureFormats()獲取相機(jī)支持的所有圖片格式

視頻分辨率

parameters.getSupportedVideoSizes()獲取相機(jī)支持的所有視頻分辨率

對(duì)焦模式

  • parameters.getSupportedFocusModes()獲取相機(jī)支持的所有對(duì)焦模式

曝光補(bǔ)償

  • parameters.getMinExposureCompensation()獲取相機(jī)支持的最低曝光補(bǔ)償
  • parameters.getMaxExposureCompensation()獲取相機(jī)支持的最高曝光補(bǔ)償

閃光燈模式

  • parameters.getSupportedFlashModes()獲取相機(jī)支持的閃光燈模式

白平衡

  • parameters.getSupportedWhiteBalance()獲取相機(jī)支持的白平衡

場(chǎng)景

parameters.getSupportedSceneModes()獲取相機(jī)支持的場(chǎng)景

聲明GPS權(quán)限

想要拍到的照片中包含GPS信息

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

代碼如下

int numberOfCameras = Camera.getNumberOfCameras();
Log.d("123===", "相機(jī)個(gè)數(shù)===" + numberOfCameras);
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
for (int i = 0; i < numberOfCameras; i++) {
    Camera.getCameraInfo(i, cameraInfo);
    //后置:0 CAMERA_FACING_BACK路狮; 前置:1 CAMERA_FACING_FRONT
    Log.d("123===", "當(dāng)前相機(jī)信息=" + cameraInfo.facing);
}


Camera camera = mPreview.getCamera();
Camera.Parameters parameters = camera.getParameters();

Log.d("123===", "預(yù)覽分辨率-----------");
List<Camera.Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
for (Camera.Size previewSize : supportedPreviewSizes) {
    Log.d("123===", previewSize.width + "---" + previewSize.height);
}
Log.d("123===", "預(yù)覽分辨率-----------");
Log.d("123===", "");
Log.d("123===", "");


Log.d("123===", "獲得相機(jī)支持的圖片預(yù)覽格式-----------ImageFormat");
List<Integer> supportedPreviewFormats = parameters.getSupportedPreviewFormats();
for (Integer supportedPreviewFormat : supportedPreviewFormats) {
    Log.d("123===", supportedPreviewFormat + "");
}
Log.d("123===", "獲得相機(jī)支持的圖片預(yù)覽格式-----------");
Log.d("123===", "");
Log.d("123===", "");


Log.d("123===", "照片分辨率-----------");
List<Camera.Size> supportedPictureSizes = parameters.getSupportedPictureSizes();
for (Camera.Size pictureSize : supportedPictureSizes) {
    Log.d("123===", pictureSize.width + "---" + pictureSize.height);
}
Log.d("123===", "照片分辨率-----------");
Log.d("123===", "");
Log.d("123===", "");


Log.d("123===", "獲得相機(jī)支持的圖片格式-----------ImageFormat");
List<Integer> supportedPictureFormats = parameters.getSupportedPictureFormats();
for (Integer supportedPreviewFormat : supportedPictureFormats) {
    Log.d("123===", supportedPreviewFormat + "");
}
Log.d("123===", "獲得相機(jī)支持的圖片格式-----------");
Log.d("123===", "");
Log.d("123===", "");


Log.d("123===", "視頻分辨率-----------");
List<Camera.Size> supportedVideoSizes = parameters.getSupportedVideoSizes();
for (Camera.Size supportedVideoSize : supportedVideoSizes) {
    Log.d("123===", supportedVideoSize.width + "---" + supportedVideoSize.height);

}
Log.d("123===", "視頻分辨率-----------");
Log.d("123===", "");
Log.d("123===", "");

Log.d("123===", "對(duì)焦模式-----------ImageFormat");
List<String> supportedFocusModes = parameters.getSupportedFocusModes();
for (String supportedFocusMode : supportedFocusModes) {
    Log.d("123===", supportedFocusMode + "");
}
Log.d("123===", "對(duì)焦模式-----------");
Log.d("123===", "");
Log.d("123===", "");

Log.d("123===", "曝光補(bǔ)償-----------");
int minExposureCompensation = parameters.getMinExposureCompensation();
int maxExposureCompensation = parameters.getMaxExposureCompensation();
Log.d("123===", "最高=" + maxExposureCompensation);
Log.d("123===", "最低=" + minExposureCompensation);
Log.d("123===", "曝光補(bǔ)償-----------");
Log.d("123===", "");
Log.d("123===", "");


Log.d("123===", "支持閃光燈模式-----------");
List<String> supportedFlashModes = parameters.getSupportedFlashModes();
for (String supportedFlashMode : supportedFlashModes) {
    Log.d("123===", "閃光模式--->" + supportedFlashMode);
}
Log.d("123===", "支持閃光燈模式-----------");
Log.d("123===", "");
Log.d("123===", "");


Log.d("123===", "支持白平衡-----------");
List<String> supportedWhiteBalance = parameters.getSupportedWhiteBalance();
for (String s : supportedWhiteBalance) {
    Log.d("123===", "--->" + s);
}
Log.d("123===", "支持白平衡-----------");
Log.d("123===", "");
Log.d("123===", "");

Log.d("123===", "場(chǎng)景-----------");
List<String> supportedSceneModes = parameters.getSupportedSceneModes();
for (String s : supportedSceneModes) {
    Log.d("123===", "--->" + s);
}
Log.d("123===", "場(chǎng)景-----------");
Log.d("123===", "");
Log.d("123===", "");

拍照虫啥,視頻,對(duì)焦

假如需要使用原生拍照功能的話,Camera#takePicture()

拍照和視頻都是網(wǎng)上那一套流程奄妨,具體的因?yàn)闀r(shí)間原因暫時(shí)先這樣了涂籽。

相機(jī)預(yù)覽和保存注意事項(xiàng)

下面三張圖片引用自:Android: Camera相機(jī)開(kāi)發(fā)詳解(中) ——實(shí)現(xiàn)預(yù)覽、拍照砸抛、保存照片等功能

  • 相機(jī)預(yù)覽方向
相機(jī)預(yù)覽方向
  • 采集的圖像方向
采集的圖像方向
  • 前置攝像頭預(yù)覽與保存一致
前置攝像頭預(yù)覽與保存一致

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末直焙,一起剝皮案震驚了整個(gè)濱河市景东,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌箕般,老刑警劉巖耐薯,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異丝里,居然都是意外死亡曲初,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)杯聚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)臼婆,“玉大人,你說(shuō)我怎么就攤上這事幌绍“涔樱” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵傀广,是天一觀的道長(zhǎng)颁独。 經(jīng)常有香客問(wèn)我,道長(zhǎng)伪冰,這世上最難降的妖魔是什么誓酒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上靠柑,老公的妹妹穿的比我還像新娘寨辩。我一直安慰自己,他們只是感情好歼冰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布靡狞。 她就那樣靜靜地躺著,像睡著了一般隔嫡。 火紅的嫁衣襯著肌膚如雪甸怕。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天畔勤,我揣著相機(jī)與錄音蕾各,去河邊找鬼。 笑死庆揪,一個(gè)胖子當(dāng)著我的面吹牛式曲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缸榛,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吝羞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了内颗?” 一聲冷哼從身側(cè)響起钧排,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎均澳,沒(méi)想到半個(gè)月后恨溜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡找前,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年糟袁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躺盛。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡项戴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出槽惫,到底是詐尸還是另有隱情周叮,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布界斜,位于F島的核電站仿耽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏各薇。R本人自食惡果不足惜项贺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敬扛,春花似錦、人聲如沸朝抖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)治宣。三九已至急侥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侮邀,已是汗流浹背坏怪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绊茧,地道東北人铝宵。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓栅干,卻偏偏與公主長(zhǎng)得像簸州,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子川慌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容