Android 7.0,6.0系統相機調用問題解決

做項目用到Android自帶相機的地方蠻多,也經常看到羣裏有人在問。

所以決定把思路和代碼寫出來,以供自己以後參考。


第一步申請權限

xml裏面也要申請權限喲

6.0及以上都要申請危險權限,我是在github上找的一個依賴,挺好用的,只填寫需要的權限就可以了。

compile 'com.mylhyl:acp:1.1.7'



第二步。調用系統相機

獲得路徑,6.0以上要用ContentValues傳路徑過去,如果我們不傳路徑也可以通過onActivityResult的data獲得圖片,但是因爲data的數據量太小,出來的圖片都很模糊,就感覺像是擼多了。。。所以我們要傳一個路徑過去,讓拍好的照片保存起來。

    private String mFilePath;

    public void starSystemPhone(UtilityBean utilityBean) {
        this.utilityBean = utilityBean;
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        mFilePath = Environment.getExternalStorageDirectory().getPath() + "/" + VersatileTool.getTime() + ".png";// 指定路徑
        File file = new File(mFilePath);
        if (file != null) {
            if (Build.VERSION.SDK_INT >= 24) {
                ContentValues contentValues = new ContentValues(1);
                contentValues.put(MediaStore.Images.Media.DATA, mFilePath);
                Uri uri = getApplicationContext().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                startActivityForResult(intent, Util.REQUEST_SYSTEM_TAKE);
            } else {
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
                startActivityForResult(intent, Util.REQUEST_SYSTEM_TAKE);
            }
        } else TLog.error("沒有文件");


//        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//        startActivityForResult(intent, Util.REQUEST_SYSTEM_TAKE);
    }


第三步。獲得返回值。因爲我們傳的是路徑,所以data是null。

就直接獲得文件判斷是否爲null,最好測試的時候轉成bitmap顯示出來。



調用7.0相機

前幾個步驟是一樣的,只是要添加以下東西。

因爲7.0不能直接獲得路徑,所以我們需要找個東西代替一下。

我背上的發現圖片會被壓縮,所以我這裏把代碼貼了出來,前面的name自定義,自己看得懂就好,後面填寫自己的包名。

<resources>
    <paths>
        <external-path name="my_images" path="Android/data/填寫自己的包名/" />
        <!--<external-cache-path name="cache_download" path="Android/data/com.example.suyou_hsl_n/files/download"/>-->
        <external-path path="." name="external_storage_root" />
        <files-path name="media"/>
    </paths>

</resources>



那我們現在創建了新的路徑,所以現在要去讓系統知道7.0要獲得的是這個路徑。

這段代碼是寫在application裏的


結束

有什麼問題,或者我哪一步寫錯,麻煩評論裏說。因爲很多東西我都是測試過了並沒有深究。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章