使用Android系統(tǒng)相機(jī)捕獲圖片(二)

寫(xiě)文章的目的

  1. 靜下心來(lái)學(xué)習(xí)
  2. 知識(shí)點(diǎn)的積累
  3. 總結(jié)透罢,做筆記

導(dǎo)讀

承接上篇文章使用Android系統(tǒng)相機(jī)捕獲圖片(一)堵幽,如果調(diào)用系統(tǒng)相機(jī)垫释,如何去獲取大圖片拓挥?

需求

  • 調(diào)用系統(tǒng)相機(jī)
  • 返回大圖片
  • 顯示圖片

代碼解構(gòu)

  1. 為了獲取更大的圖片菇爪,可以將一個(gè)附加值傳遞給觸發(fā)系統(tǒng)相機(jī)的intent算芯,這個(gè)附加值extrakeyMediaStore類中指定,是常量EXTRA_OUTPUT:這個(gè)附加值extravalue將以Uri的方式指示系統(tǒng)相機(jī)你想要將捕獲的圖像保存在什么位置凳宙。

將圖片保存在Environment.getExternalStorageDirectory()+"/rflash"+"/my.jpg"熙揍。這里我是將圖片放在了外部?jī)?chǔ)存卡/rflash/my.jpg中,提個(gè)問(wèn)題:能將圖片放在內(nèi)部?jī)?chǔ)存中嗎氏涩?比如getFilesDir()+"/rflash"+"/my.jpg"届囚,這個(gè)有興趣的可以去做測(cè)試有梆。

  • 創(chuàng)建圖片存儲(chǔ)路徑(path),因?yàn)樵O(shè)計(jì)到文件存儲(chǔ)意系,需要添加讀寫(xiě)權(quán)限泥耀。
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    /**
     * 圖片存儲(chǔ)路徑
     */
    private String mImageFilePath;

 /**
     * 構(gòu)建圖片路徑
     * 將圖片保存在Environment.getExternalStorageDirectory()+"/rflash"+"/my.jpg"
     */
    private void createImageFilePath() {
        mImageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "rflash" + File.separator + "my.jpg";
    }
  • 通過(guò)路徑生成圖片Uri
 /**
     * 獲取圖片uri
     *
     * @return
     */
    private Uri getImageUri() {
        File file = new File(mImageFilePath);
        Uri imageUri = Uri.fromFile(file);
        return imageUri;
    }
  • 打開(kāi)相機(jī)
   /**
     * 打開(kāi)相機(jī)
     */
    private void openCameraForResult() {
        //創(chuàng)建intent ,設(shè)置action
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //構(gòu)建圖片路徑
        createImageFilePath();
        //將捕獲的圖片保存在imageUri
        intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri());
        //調(diào)用相機(jī)
        startActivityForResult(intent, IMAGE_RESULT);
    }
  1. 返回圖片并顯示:既然使用startActivityForResult蛔添,當(dāng)然要用onActivityResult去接收痰催。
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == IMAGE_RESULT) {
            //這里不能通過(guò)Intent對(duì)象去獲取"data",
            // 因?yàn)樵诖蜷_(kāi)相機(jī)時(shí)已經(jīng)通過(guò)MediaStore.EXTRA_OUTPUT告訴相機(jī):你把圖片放在我傳給你的Uri中
            //所以可以直接通過(guò)BitmapFactory在存儲(chǔ)路徑中獲取圖片
            Bitmap bitmap = BitmapFactory.decodeFile(mImageFilePath);
            imageView.setImageBitmap(bitmap);
        }
    }
  1. 顯示結(jié)果:項(xiàng)目是在同事的手機(jī)上運(yùn)行的(沒(méi)法截圖迎瞧,通過(guò)我手機(jī)拍照然后上傳到簡(jiǎn)書(shū))夸溶,魅族手機(jī),系統(tǒng)版本5.1凶硅。圖中可以看的缝裁,我們獲取了大圖并顯示。


    1541572796220.jpg

總結(jié)

那么 使用Android系統(tǒng)相機(jī)捕獲圖片就只是這樣了嗎咏尝?我在上一篇就說(shuō)過(guò)压语,這個(gè)功能在我看來(lái)是個(gè)復(fù)合功能。同樣地编检,拋出問(wèn)題胎食,下回分解。

  • 如果將項(xiàng)目運(yùn)行在高版本手機(jī)上可以實(shí)現(xiàn)需求嗎允懂?如何解決 厕怜?

代碼樣例

1.xml代碼

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="capture_image"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@+id/iv"
        android:layout_marginTop="30dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btn" />


</android.support.constraint.ConstraintLayout>

2.java代碼

package com.rflash.captrueimage02;

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.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.File;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button button;
    private ImageView imageView;

    private final int IMAGE_RESULT = 0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.btn);
        imageView = findViewById(R.id.iv);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id) {
            case R.id.btn:
                //打開(kāi)相機(jī)
                openCameraForResult();
                break;
        }
    }

    /**
     * 圖片存儲(chǔ)路徑
     */
    private String mImageFilePath;

  /**
     * 構(gòu)建圖片路徑
     * 將圖片保存在Environment.getExternalStorageDirectory()+"/rflash"+"/my.jpg"
     */
    private void createImageFilePath() {
        mImageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "rflash" + File.separator + "my.jpg";
    }

    /**
     * 獲取圖片uri
     *
     * @return
     */
    private Uri getImageUri() {
        File file = new File(mImageFilePath);
        Uri imageUri = Uri.fromFile(file);
        return imageUri;
    }

    /**
     * 打開(kāi)相機(jī)
     */
    private void openCameraForResult() {
        //創(chuàng)建intent ,設(shè)置action
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //構(gòu)建圖片路徑
        createImageFilePath();
        //將捕獲的圖片保存在imageUri
        intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri());
        //調(diào)用相機(jī)
        startActivityForResult(intent, IMAGE_RESULT);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == IMAGE_RESULT) {
            //這里不能通過(guò)Intent對(duì)象去獲取"data"蕾总,
            // 因?yàn)樵诖蜷_(kāi)相機(jī)時(shí)已經(jīng)通過(guò)MediaStore.EXTRA_OUTPUT告訴相機(jī):你把圖片放在我傳給你的Uri中
            //所以可以直接通過(guò)BitmapFactory在存儲(chǔ)路徑中獲取圖片
            Bitmap bitmap = BitmapFactory.decodeFile(mImageFilePath);
            imageView.setImageBitmap(bitmap);
        }
    }
}

3.AndroidManifest.xml中需要添加權(quán)限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末粥航,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子生百,更是在濱河造成了極大的恐慌递雀,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚀浆,死亡現(xiàn)場(chǎng)離奇詭異缀程,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)市俊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)杨凑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人摆昧,你說(shuō)我怎么就攤上這事撩满。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵伺帘,是天一觀的道長(zhǎng)昭躺。 經(jīng)常有香客問(wèn)我,道長(zhǎng)曼追,這世上最難降的妖魔是什么窍仰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮礼殊,結(jié)果婚禮上驹吮,老公的妹妹穿的比我還像新娘。我一直安慰自己晶伦,他們只是感情好碟狞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著婚陪,像睡著了一般族沃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泌参,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天脆淹,我揣著相機(jī)與錄音,去河邊找鬼沽一。 笑死盖溺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的铣缠。 我是一名探鬼主播烘嘱,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蝗蛙!你這毒婦竟也來(lái)了蝇庭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捡硅,失蹤者是張志新(化名)和其女友劉穎哮内,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體壮韭,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡北发,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泰涂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲫竞。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辐怕,死狀恐怖逼蒙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寄疏,我是刑警寧澤是牢,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布僵井,位于F島的核電站,受9級(jí)特大地震影響驳棱,放射性物質(zhì)發(fā)生泄漏批什。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一社搅、第九天 我趴在偏房一處隱蔽的房頂上張望驻债。 院中可真熱鬧,春花似錦形葬、人聲如沸合呐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)淌实。三九已至,卻和暖如春猖腕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工埃疫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堂鲤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓侠仇,卻偏偏與公主長(zhǎng)得像轻姿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逻炊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • 用兩張圖告訴你互亮,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,723評(píng)論 2 59
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評(píng)論 25 707
  • 1余素、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,980評(píng)論 3 119
  • No. 4 《春詞二首》 常建 菀菀黃柳絲豹休,濛濛雜花垂。日高紅妝臥桨吊,倚對(duì)春光遲威根。寧知傍淇水,騕褭黃金羈视乐。 翳...
    Dr_Niu閱讀 1,787評(píng)論 0 0
  • 安安扔下一堆飯桌上目瞪口呆的人佑淀,哭著走了留美。這是安安和平過(guò)得第三個(gè)圣誕節(jié)了。雖然在不一樣的地方,但是谎砾,都是一大堆...
    金枝不讀書(shū)閱讀 681評(píng)論 0 0