1. 程式人生 > >Android8.0以上開啟相機並裁剪圖片

Android8.0以上開啟相機並裁剪圖片

Android7.0以上開啟相機的許可權更加嚴格了,有很多部落格也是講這些具體操作的,如果想更深入瞭解,請自行搜尋,這裡我只是列出使用的方法,第一行程式碼第二版的內容,開啟相機的許可權是基於android7.0,如果完整的按照書上內容寫個demo,是可以實現的。這裡面我綜合了書上的內容,在加上從幾篇部落格上的總結,寫了一個測試的Demo,執行在真機上是沒問題(android8.0)。
下面說一下步驟
1、在AndroidManifest.xml檔案下的《application》標籤中定義一個《provider》內容提供者。

  <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="你自己的包名"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>

2、在res檔案目錄下建立一個xml資料夾,裡面生成一個provider_paths.xml檔案

    <paths xmlns:android="http://schemas.android.com/apk/res/android">
            <!--"."表示所有路徑-->
            <external-path name="名字隨便填" path="."/>
    </paths>    

3、開啟相機`

 private void openCamera() {
         //建立一個儲存圖片的路徑
    File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
    try {
        if (outputImage.exists()) {
            outputImage.delete();
        }
        outputImage.createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }
    //如果android7.0以上的系統,需要做個判斷
    if (Build.VERSION.SDK_INT >= 24) {
        ImageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.myapplication.provider", outputImage);//7.0
    } else {
        ImageUri = Uri.fromFile(outputImage); //7.0以下
    }
    //利用隱式Intent 開啟系統相機
    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
    intent.putExtra(MediaStore.EXTRA_OUTPUT, ImageUri);
    startActivityForResult(intent, TAKE_PHOTO);//這裡的TAKE_PHOTO是定義的一個靜態常數變數
}

4、由於是startActivityForResult啟動的系統相機,所以照完的照片可以用onActivityResult方法接受。

  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            //擷取相機拍照後的圖片
            case TAKE_PHOTO:
                startPhotoZoom(ImageUri);//這裡呼叫了擷取圖片的方法
                break
; //返回擷取後的結果 case RESULT_REQUEST_CODE: if (resultCode == RESULT_OK) { try { Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(ImageUri)); imageButton.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } break;

4.1、擷取圖片的方法startPhotoZoom

 private void startPhotoZoom(Uri uri) {
        File CropPhoto = new File(getExternalCacheDir(), "Crop.jpg");//這個是建立一個擷取後的圖片路徑和名稱。
        try {
            if (CropPhoto.exists()) {
                CropPhoto.delete();
            }
            CropPhoto.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        ImageUri = Uri.fromFile(CropPhoto);
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //新增這一句表示對目標應用臨時授權該Uri所代表的檔案
        }
        intent.putExtra("crop", "true");
        intent.putExtra("scale", true);

        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);

        //輸出的寬高

        intent.putExtra("outputX", 300);
        intent.putExtra("outputY", 300);

        intent.putExtra("return-data", false);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, ImageUri);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true); // no face detection
        startActivityForResult(intent, RESULT_REQUEST_CODE);//這裡的RESULT_REQUEST_CODE是在startActivityForResult裡使用的返回值。
    }

相關推薦

Android8.0以上開啟相機裁剪圖片

Android7.0以上開啟相機的許可權更加嚴格了,有很多部落格也是講這些具體操作的,如果想更深入瞭解,請自行搜尋,這裡我只是列出使用的方法,第一行程式碼第二版的內容,開啟相機的許可權是基於android7.0,如果完整的按照書上內容寫個demo,是可以實現的。

開啟安卓手機相簿和相機裁剪圖片上傳到unity

1、建立一個空的安卓工程 2、在unity安裝目錄下找到classes.jar檔案並匯入到工程中的libs資料夾下(classes.jar目錄為:unity安裝目錄\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Devel

Android調用相機實現拍照裁剪圖片,調用手機中的相冊圖片裁剪圖片

!= findview create 圖片剪裁 顯示 parent 學會 true mfile 在 Android應用中,非常多時候我們須要實現上傳圖片,或者直接調用手機上的拍照功能拍照處理然後直接顯示並上傳功能,以下將講述調用相機拍照處理圖片然後顯示和調用手機相冊中的

Android呼叫相機實現拍照裁剪圖片,呼叫手機中的相簿圖片裁剪圖片

在 Android應用中,很多時候我們需要實現上傳圖片,或者直接呼叫手機上的拍照功能拍照處理然後直接顯示並上傳功能,下面將講述呼叫相機拍照處理圖片然後顯示和呼叫手機相簿中的圖片處理然後顯示的功能,要想實現上傳功能,一般都是上傳到資料庫中,將imageView中的圖片取出來然

Android7.0以上開啟相機閃退,startActivityForResult報錯解決

這個問題出現的原因主要是由於在Android 7.0以後,用了Content Uri 替換了原本的File Uri,故在targetSdkVersion=24的時候,部分 “`Uri.fromFile()“` 方法就不適用了。 **File Uri 與 Content Uri

eclipse連接Android8.0以上手機無法打印日誌的問題

打印日誌 sdk 概述 測試 androi onf oid lin 文件 概述 我的eclipse的環境: Eclipse:Eclipse IDE for Java DevelopersVersion: Luna Service Release 2 (4.4.2) A

Android8.0以上的notification和startForeground

1,startForeground方法,避免service被殺死 private void setNotification(String text) { Intent intent = new Intent(this, MainActivity.class);

android8.0中呼叫相機拍照

網址:https://blog.csdn.net/q992767879/article/details/79654733   1.<!--android8.0需要的配置,主要是呼叫相機-->   <provider          android:name

解決Android 6.0以上相機許可權適配問題

近期創業大潮中,幾個小夥伴,拼了命往前趕,這邊app一個月連帶著服務端一個人搞定,這幾天遇到一個問題 使用zxing掃碼的時候,CaptureActivity介面的相機不能使用,log一下,顯示camera為空,其實之前我一直懷疑是不是,Android 6.0不支援came

android 呼叫系統相機獲取圖片路徑

思路: 呼叫系統的相機之前,設法指定圖片的路徑, 然後從指定的路徑中獲取圖片.不要從返回的意圖Intent中獲取圖片的路徑, 因為,不同的手機廠商對此的處理不同.有些可能會獲取到圖片的路徑,有些卻返回null. /** *

(複習)android 呼叫系統相機 相簿 裁剪-圖片上傳-客服端-伺服器

效果: 客服端程式碼: package com.cn.lxz.zhaopian; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat;

Halcon聯合VS2010開啟相機顯示

在開始之前需要安裝好Halcon 12和VS2010,具體的話VS2010是免費的可以直接在微軟官方下載,Halcon12這個可以參考Halcon學習網(http://www.ihalcon.com/read-7605-1.html) 一、開啟Halcon,開啟助手,獲取開

Android7.0呼叫系統相機裁剪

最近將專案的targetSdkVersion升級到了26,發現呼叫系統相機的時候報了下面這個錯誤: android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/b

Unity呼叫android7.0以上系統相機崩潰問題

點選開啟連結之http://www.cnblogs.com/dazhao/p/6547811.html 前看了許多解決android7.0系統拍照奔潰問題的帖子,照做之後還是有問題,最終發現了上面的部落格,經過測試可用,untiy互動的話需要改一些東西,以及上面帖子裡的de

android6.0以上開啟熱點失敗

    最近在做手機移動端檔案傳輸app,該專案需要一端開啟熱點,另一端連線該熱點,從而兩個段之間建立區域網,進而通過socket通訊實現檔案傳輸功能,隨著測試的深入,發現,如果設定targetSdkversion >= 23的時候熱點建立失敗。百度了一下,全是許可權

Android呼叫系統相機、相簿、裁剪圖片壓縮上傳(適配7.0

作者:八怪不姓醜 連結:http://www.jianshu.com/p/e11a34e2ea4f 著作權歸作者所有,本文經作者授權推送。 一、前言 最近在開發中遇到了一個比較棘手的問題 由於在之前使用的版本-targetSdkVersion小於24也就是小於7.

Android拍照及圖片裁剪、呼叫系統相簿(相容6.0以上許可權處理及7.0以上檔案管理)

前言: 最近工作修改較舊的專案時,涉及到了圖片相關功能 ,在使用安卓6.0手機及7.1手機拍照時,遇到了因許可權及檔案管理導致程式崩潰等問題。 剛好把功能修改完,把程式碼簡單地貼一下,方便以後使用。 本文demo包含以下要點: Android6.0執

Android拍照和從相簿獲取圖片(解決android7.0開啟相機崩潰的問題),同時也解決了拍完照後圖片方向不正的問題

再android7.0中相機操作需要動態申請許可權,在點選開啟相機按鈕時要先判斷許可權,沒有許可權要申請,有許可權再操作,同時在申請許可權的回撥方法中也要判斷是否有許可權,有許可權的話再呼叫開啟相機的方法 package test.img.com.myim

Android 7.0及其以上系統拍照,開啟相簿,裁剪,報錯: android.os.FileUriExposedException: file:///storage/emulated/0/.....

全部程式碼:點選下載注意:如果你原先的應用的targetSdkVersion本來就小與27。那就拍照。什麼都不修改。也不會崩潰。但是、一旦你修改了你的targetSdkVersion為27.或者28。那你的應用就會報出這些問題。。具體原因。請自行百度下targetSdkVer

Android呼叫系統圖庫和相機獲取圖片裁剪

最近用到從系統圖庫和相機獲取圖片並裁剪當頭像,根據郭霖大神的第一行程式碼呼叫相機和圖冊,來進行擴充套件和總結。 1、獲取許可權 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORA