Android拍照選取圖片

Android拍照選取圖片

Android經(jīng)常會需要拍照总寻、裁剪及圖庫中選擇圖片纸厉,其實都是通過intent調(diào)用系統(tǒng)相機或者系統(tǒng)圖冊锐帜,然后在onActivityResult中捕捉返回即可祭示。

  • 正常拍照選擇圖片的代碼:
例:

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

在onActivityResult中通過返回的intent.getExtras().get("data")便可以獲取圖片,但Android默認可用的應用內(nèi)存大約為16M.所以Android為了不超出內(nèi)存限制辟拷,在拍照返回時通過intent返回的bitmap會被壓縮,這樣導致一直都是獲取的小圖阐斜。所以在拍照時如果想返回大圖需要通過Uri返回衫冻。

#####拍照選擇大圖代碼(tampUri為路徑饵沧,開發(fā)者文檔提供的代碼):

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // 指定調(diào)用相機拍照后照片的儲存路徑
        intent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
在onActivityResult中通過tempUri進行下一步操作晃财。

說明:

存儲圖片的路徑建議使用 Activity.this.getExternalCacheDir()返回的/storage/sdcard0/Android/data/<package name>/cache路徑.
通過路徑獲取 Uri 的方法,需要對不同版本兼容處理:

7.0 以下系統(tǒng): 使用 Uri.fromFile(new File(path)) 等即可.

String fileName = "temp.jpg";
File tmpFile = new File(this.getExternalCacheDir(),fileName);
Uri tmpUri = Uri.fromFile(tmpFile);
  • 7.0 系統(tǒng)上,因為不允許傳遞通過 intent 傳遞 file:// 路徑, 如果設置 targetSDK 為 24(7.0), 系統(tǒng)相機則無法獲得 Uri.需要使用以下方法來獲取 Uri.
    注意:AndroidManifest 中的 provider authorities 與 FileProvider.getUriForFile(); 方法中 authority 一致

如:

    String authority = "com.text.images";

    FileProvider.getUriForFile(mContext, authority, filePath);

    <!-- grantUriPermissions:true,表示授予 URI 臨時訪問權限酌儒。 //exported:要求必須為false笤喳,為true則會報安全異常为居。 -->
            <provider
                android:name="android.support.v4.content.FileProvider"
                android:authorities="com.text.images"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/provider_paths" />
            </provider>


在 AndroidManifest.xml 中設置 provider:

 <provider
     android:authorities="${applicationId}"
     android:name="android.support.v4.content.FileProvider"
     android:exported="false"
     android:grantUriPermissions="true">
     <meta-data
         android:name="android.support.FILE_PROVIDER_PATHS"
          android:resource="@xml/provider_paths"/>
</provider>
在 res 目錄下新建 xml 目錄, 新建 provider_paths.xml 文件:

這里我使用了外部存儲 external-path, 具體標簽參考 FileProvider .

        <?xml version="1.0" encoding="utf-8"?>
        <paths xmlns:android="http://schemas.android.com/apk/res/android">
            <external-path name="image_file" path="."/>
        </paths>

判斷系統(tǒng)版本大于7.0時,采用 FileProvider 獲取 Uri:

        tring fileName = "temp.jpg";
        File tmpFile = new File(this.getExternalCacheDir(),fileName);
        tmpUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID, tmpFile)

為了防止Uri路徑不對導致不能保存,使用前必須確保文件路徑無誤杀狡,不然會導致“無法保存剪裁的圖片”的錯誤蒙畴。或者無提示但不能點擊確定保存圖片捣卤。正確獲取的Uri最終以file://開頭

常見問題:

設置通過Uri返回后忍抽,onActivityResult中返回的intent為null。
開發(fā)者文檔中只說了簡單調(diào)用的方法董朝,其實可以添加一些其他屬性鸠项。

        intent.putExtra("return-data",false);
        intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true);
        不能添加intent.setType("image/*");,會因為找不到intent導致ActivityNotFoundException子姜。
        intent.putExtra("android.intent.extras.CAMERA_FACING",1);祟绊,系統(tǒng)默認開啟的是后置攝像頭,如果希望選擇前置攝像頭可以加這句哥捕。

完整代碼:

    Intent openPhotoIntent;
            if (Build.VERSION.SDK_INT < 19) {
                openPhotoIntent = new Intent();
                openPhotoIntent.setAction(Intent.ACTION_GET_CONTENT);
                openPhotoIntent.setType(mFileTypes);
            } else {
                openPhotoIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                openPhotoIntent.setType(mFileTypes);
            }
            return openPhotoIntent;



            Intent openPhotoIntent;
                    if (Build.VERSION.SDK_INT < 19) {
                        openPhotoIntent = new Intent();
                        openPhotoIntent.setAction(Intent.ACTION_GET_CONTENT);
                        openPhotoIntent.setType(mFileTypes);
                    } else {
                        openPhotoIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                        openPhotoIntent.setType(mFileTypes);
                    }
                    return openPhotoIntent;
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末牧抽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子遥赚,更是在濱河造成了極大的恐慌扬舒,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凫佛,死亡現(xiàn)場離奇詭異讲坎,居然都是意外死亡孕惜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門晨炕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衫画,“玉大人,你說我怎么就攤上這事瓮栗∠髡郑” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵费奸,是天一觀的道長弥激。 經(jīng)常有香客問我,道長货邓,這世上最難降的妖魔是什么秆撮? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮换况,結果婚禮上职辨,老公的妹妹穿的比我還像新娘。我一直安慰自己戈二,他們只是感情好舒裤,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著觉吭,像睡著了一般腾供。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鲜滩,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天伴鳖,我揣著相機與錄音,去河邊找鬼徙硅。 笑死榜聂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的嗓蘑。 我是一名探鬼主播须肆,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼桩皿!你這毒婦竟也來了豌汇?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤泄隔,失蹤者是張志新(化名)和其女友劉穎拒贱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佛嬉,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡柜思,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年岩调,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赡盘。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缰揪,靈堂內(nèi)的尸體忽然破棺而出陨享,到底是詐尸還是另有隱情,我是刑警寧澤钝腺,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布抛姑,位于F島的核電站,受9級特大地震影響艳狐,放射性物質發(fā)生泄漏定硝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一毫目、第九天 我趴在偏房一處隱蔽的房頂上張望蔬啡。 院中可真熱鬧,春花似錦镀虐、人聲如沸箱蟆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽空猜。三九已至,卻和暖如春恨旱,著一層夾襖步出監(jiān)牢的瞬間辈毯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工搜贤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谆沃,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓入客,卻偏偏與公主長得像管毙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子桌硫,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,071評論 25 707
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程夭咬,因...
    小菜c閱讀 6,401評論 0 17
  • 臨近期末,目前在進行Android課程設計铆隘,對于我這個壓根不怎么學習的孩子來說卓舵,剛開始的完全是懵逼的,后來花兩天時...
    站在冰箱上的姑娘閱讀 23,932評論 5 41
  • 我們?nèi)松挥幸淮文匕蚰疲乙鯓硬潘悴话讈硪惶颂屯澹@個無法彩排的世界裹虫,每時每刻都得精打細算的珍惜!
    隨緣而聚_466c閱讀 102評論 0 0
  • 歲末新年融击,很多小伙伴都特別積極地曬出了2017年的計劃筑公,而我還遲遲沒有動筆,不是想偷懶尊浪,而是希望自己真的想清楚匣屡,不...
    談談minda閱讀 232評論 0 0