1. 程式人生 > >安卓7.0開啟相機(許可權與內容提供器)

安卓7.0開啟相機(許可權與內容提供器)

本文大部分來自第二行程式碼,只是部分許可權問題改動與說明
其中主要問題就是安卓6.0許可權問題和7.0url問題。

  1. 首先需要設定許可權
    <!-- 攝像頭 -->
    <uses-permission android:name="android.permission.CAMERA" />
    <!-- 獲取sd卡寫的許可權,用於檔案上傳和下載 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    這是使用照相機和可以修改記憶體的許可權

    2.然後是關於file的uri
    安卓7.0要求,禁止暴露file的uri,否則會報錯FileUriExposeException錯誤,必須使用fileProvider把uri封裝再傳給外部。配置如下
    ① 設定在<manifest>裡設定

  <application
<provider          android:name="android.support.v4.content.FileProvider"         android:authorities="com.example.mbmob.fileprovider"
 <!--
此處的authorities可以設定任意值,但是不同應用間必須不同,否則會因為資料庫重複無法安裝 -->
android:exported="false" <!--必須為false ,意思是不可被分享,這是fileprovide要求--> android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> <!--meta指定uri的共享路徑,並且引用了一個叫@xml/file_paths資源-->
</provider> </application>
②接下來在右擊res,new————directory,建立xml目錄,然後生成file_paths,內容複製如下
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path  name ="my_images"  path=""/>
    <!--name名字任意,paths為空說明整個sd卡可共享(可能紅色報錯,不用管)-->
</paths>

3拍照的相關程式碼

首先檢測許可權,照相的許可權和訪問記憶體卡的許可權

if((ContextCompat.checkSelfPermission(getActivity().getBaseContex(),Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED)||ContextCompat.checkSelfPermission(getActivity().getBaseContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) !=PackageManager.PERMISSION_GRANTED)) {
                        //如果沒有授權,則請求授權
       ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1311);
       //String陣列中為申請的許可權,第一個是相機,第二個為修改記憶體,最後的引數即為申請授權的返回值,我設定的1311
、、
                    } else {
                        zhaoxiang();
                        }
   public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {  
           case 1311:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                zhaoxiang();
            } else {
                Toast.makeText(getContext(),"沒有許可權開啟相機",Toast.LENGTH_SHORT).show();
            }
            break;
        default:
    }
}`
          public void zhaoxiang() {
    Calendar c = Calendar.getInstance();
    int year = c.get(Calendar.YEAR);
    int month = c.get(Calendar.MONTH);
    int day = c.get(Calendar.DAY_OF_MONTH);    headImage = new File(Environment.getExternalStorageDirectory() + "/mbmob/", year + "-" + month + "-" + day + i.getName() + "head.jpg");

    //建立一個file,第一個指數路徑,第二個為圖片名字  其中,路徑為sd卡中一個名為mbmob的檔案下,headImage是我提前宣告的一個空file
    //如果不加/mbob/這句,就是獲得手機裡一個專門放置應用快取的地方  get那個方法就是獲取這個位置
    try {
        if (headImage.exists()) {
            headImage.delete();
        }
        headImage.createNewFile();
        //如果原來就有這個檔案  刪除
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (Build.VERSION.SDK_INT >= 24) {
        //判斷安卓版本 高於7.0
        imageUri = FileProvider.getUriForFile(getActivity(), "com.example.mbmob.fileprovider", headImage);
        // 第一個是content ,第二個即為在provider裡是設定的author那個,第三個是File物件
    } else {
        //低於7.0
        imageUri = Uri.fromFile(headImage);
        //獲取圖片路徑
    }

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    //指定圖片的輸出地址
    startActivityForResult(intent, TAKE_PHOTO);
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {

    switch (requestCode) {
        case TAKE_PHOTO:
            //照相結束後就會返回,此時呼叫這個
            if (resultCode == RESULT_OK) {


               此時獲得的headimage就是儲存了圖片的,這裡如何利用自己定義

            }
            break;
        default:
            break;
    }

}

“`

相關推薦

7.0開啟相機許可權內容提供

本文大部分來自第二行程式碼,只是部分許可權問題改動與說明 其中主要問題就是安卓6.0許可權問題和7.0url問題。 首先需要設定許可權 <!-- 攝像頭 --> <uses-permission android:name="a

小米Note標配版 雙網通刷原生7.0教程詳細

小米note手機用了一段時間後,開始儲存不夠用了,於是想重新刷一次機,順便清洗一下記憶體。 首先備份好手機的資料,由於我手機玩遊戲建立了很多qq的小號,所以我先把這些小號備份一下,然後就是微信備份!把資料備份到電腦端。 然後開始正式工作: 1.下載ROM包,我下載的是秋大

7.0許可權及預覽版問題

昨天一覺醒來,發現安卓7.0的首個開發者預覽版竟然釋出了,驚喜之餘立馬抓起Nexus5準備升級,結果立馬被迎頭了一盆冷水,支援的裝置只有Nexus6、Nexus 5X、Nexus 6P、Nexus

7.0之後 呼叫系統相機崩潰

解決方案: 1、(推薦)7.0之後你的app就算有許可權,給出一個URI之後手機也認為你沒有許可權。不用修改原有程式碼,在Application的oncreate方法中: if (Build.VER

7.0拍照遇到 Uri暴露錯誤

meta 技術 () code hid con 目錄 view file 最近,項目又做到,調用攝像頭拍照獲取圖片這個功能。 用以前的代碼直接用,發現在Android7.0上使用時會出現問題。 Android6.0之後,動態申請權限已成常態。 調用攝像頭拍照獲取圖片這個功能

關於7.0及以上的Https請求抓包問題android:networkSecurityConfig

Android 7.0(API 級別 24)及更高版本預設只承認系統CA,所以預設是安全的,不需要配置。如果想要系統承認使用者自己安裝的CA,則修改配置(比如除錯時會需要抓包)。 面向 Android 6.0(API 級別 23)及更低版本應用的預設配置如下所示,這段配置的意思是,承認系

專案實戰之APP版本升級更新,適配7.0

前言 APP的版本升級主要分為兩種方式: 1.應用市場升級 2.應用內升級 而應用內升級的方式是目前大多數APP採用的升級更新方式。 應用內升級的模式 按照不同的業務需求又可以分為兩種: 1,強制性更新 如果APP有更新,那麼則彈出更新提示對話方塊,並且

6.0之後——動態獲取許可權封裝

轉載請註明出處    https://blog.csdn.net/lebang08/article/details/52751088 今天將專案中需要授權的地方,增加了判斷 -----------關於6.0許可權的封裝。 大家知道,在android6.0之後,谷歌為了更

專案實戰之:7.0優化下的全域性網路連線狀態監聽

須知:Android7.0起網路變化監聽隱式廣播被關閉 在 Android 7.0 版本中除了提供諸多多視窗支援、活動通知、後臺優化、訊息傳遞服務和Vulkan 等新特性和功能外,還對系統和 API 行為做出了各種變更,其中最重要的一點:Android7.0為了進行後臺的優化刪除了三

7.0以上作業系統長按桌面logo建立快捷方式

本文已授權微信公眾號:鴻洋(hongyangAndroid)在微信公眾號平臺原創首發。 就在前幾天的一個晚上, Google召開了它的秋季釋出會,

獲取渠道名渠道id Android獲取裝置唯一標識的終極解決方法,防止7.0時崩潰問題

一,先說獲取渠道名(這裡以友盟為例) /* * 4.5.1新加渠道名欄位,用來傳給後臺去統計各個渠道下載量 * */ public static String getSource() { //獲取渠道名 Strin

7.0 WebView 載入網頁空白解決辦法

mainWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(W

popwindow 在7.0上顯示位置錯誤以及在6.0下點選外部不能消失的情況解析

popwindow在日常使用的過程中頻率很高 ,一般用起來也是得心應手,但是也是有很多坑存在的,在這個版本的迭代中就遇到了一些問題,解決起來很簡單,但是以後開發中肯定要注意的 popwindow 出現的View not attached to window

PopupWindow在7.07.1系統上位置顯示異常

做專案時發現Popupwindow在7.0及以上的裝置上顯示位置異常,6.0上及以下卻沒有問題: 如下圖所示 解決方式:重寫Popupwindow的showasdrop方法: /** * 建立時間: 2017/12/5. * 創 建 人:

android apk安裝包修改了之後在7.0系統上無法安裝的解決辦法

我們在開發app的時候,往往在打包完之後還要進行分發。所以需要在安裝包中寫入一定的檔案。比如渠道或者動態新增啟動時預載入的資訊。但是現安卓開發一般用的是Android Studio ,而且Studio 版本一般都是2.2以上。問題的關鍵就是在這裡,在Studio 2.2以後

7.0上在狀態列上加電池百分比

     》》》》》》     安卓7.0上的statusbar上是預設不帶電池百分比的。需要我們加上去。有兩個方法,先寫第一個方法    1. 在frameworks/base/packages/SystemUI/res/layout/system_icons.xml

7.0手機上遇到的app升級問題終極解決方案

 相容Android 7.0 App升級 一、在AndroidManifest.xml清單檔案中註冊Provider <provider    android:name="android.support.v4.content.FileProvider"    andr

華為基於7.0的Emui5.0實戰技術開放日-成都、北京、廣州

華為釋出了基於安卓7.0的EMUI5.0,通過智慧學習系統優化安卓資源排程管理,可謂大顯身手。EMUI5.0是一款從UI設計到互動,再到效能各方面都有極大提升的系統。華為將在成都、北京、廣州舉辦三場EMUI5.0技術開放日,與資深極客、技術專家和花粉針對EMUI

解決7.0系統裁剪圖片出錯問題

        Android7.0中為了提高私有檔案的安全性,對file:// Uri 型別的Uri做出了限制,導致一些APP的功能無法正常使用。前幾天的一個頭像裁剪問題被提上了日程,開始只是修改了拍照的Uri,忘記了還要裁剪,因為直接使用的系統裁剪導致裁剪出了問題。下面

解決7.0拍照,相簿選擇崩潰的問題(包括壓縮圖片在內)

在今天,專案的功能開發的告一段落了,回顧之前遇到的難題,覺得有必要在部落格中記錄一下,也方便下次自己能快速解決問題,同時,也能給遇到同樣問題的人一個參考。 這問題就是當用戶使用android 7.0系統的手機進行拍照的時候,崩潰的問題。崩潰的原因,網上有很多詳