1. 程式人生 > >安卓選擇相簿或者相機圖片並裁剪適配華為小米機型

安卓選擇相簿或者相機圖片並裁剪適配華為小米機型

選擇圖片上傳基本是標配了,有必要寫好個通用的方法以便使用,以下是一堆程式碼,使用的時候貼上進去就可以了。

基本解決了一些常出現的問題:華為手機適配,6.0許可權申請,圖片大小控制。

1、關於許可權問題,我們使用一個開源庫:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')compile 'com.mylhyl:acp:1.1.7'
}
相機與相簿都需要讀寫許可權,相機還需要照相許可權。

2、具體程式碼,拷貝就能用:

// 拍照成功,讀取相簿成功,裁減成功
private final int ALBUM_OK 
= 101, CAMERA_OK = 102, CUT_OK = 103; private File bitfile;

private void xiangji() {
    Acp.getInstance(mContext).request(new AcpOptions.Builder().setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA).build(), new AcpListener() {
        @Override
public void onGranted
() { File dou = new File(Environment.getExternalStorageDirectory(), "dou"); if (!dou.exists()) { dou.mkdirs();// 2.建立相片的儲存目錄 } // 定義拍照後存放圖片的檔案位置和名稱,使用完畢後可以方便刪除 String fileName = new SimpleDateFormat("ss-SSS") .format(new Date()) + ".jpg"
; bitfile = new File(dou, fileName); // 來自相機 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 下面這句指定呼叫相機拍照後的照片儲存的路徑 cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(bitfile)); startActivityForResult(cameraIntent, CAMERA_OK);// CAMERA_OK是用作判斷返回結果的標識 } @Override public void onDenied(List<String> list) { Qiuutil.ShortToast(list.toString() + "許可權拒絕"); } }); } private void xiangce() { Acp.getInstance(PersonInfoActivity.this).request(new AcpOptions.Builder().setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).build(), new AcpListener() { @Override public void onGranted() { File dou = new File(Environment.getExternalStorageDirectory(), "dou"); if (!dou.exists()) { dou.mkdirs();// 2.建立相片的儲存目錄 } // 定義拍照後存放圖片的檔案位置和名稱,使用完畢後可以方便刪除 String fileName = new SimpleDateFormat("ss-SSS") .format(new Date()) + ".jpg"; bitfile = new File(dou, fileName); // 來自相簿 Intent albumIntent = new Intent(Intent.ACTION_PICK, null); /** * 下面這句話,與其它方式寫是一樣的效果,如果: * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI); * intent.setType(""image/*");設定資料型別 * 要限制上傳到伺服器的圖片型別時可以直接寫如:"image/jpeg 、 image/png等的型別" */ albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(albumIntent, ALBUM_OK); } @Override public void onDenied(List<String> list) { Qiuutil.ShortToast(list.toString() + "許可權拒絕"); } }); }
/**
 * 裁剪圖片方法實現
 *
 * @param uri  圖片uri
 * @param type 類別:相機,相簿
 */
public void clipPhoto(Uri uri, int type) {


    Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// 下面這個crop = true是設定在開啟的Intent中設定顯示的VIEW可裁剪
intent.putExtra("crop", "true");
// aspectX aspectY 是寬高的比例,這裡設定的是正方形(長寬比為1:1)
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪圖片寬高
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("return-data", false);
/**
     * 此處做一個判斷
     * 1,相機取到的照片,我們把它做放到了定義的目錄下。就是file
     * 2,相簿取到的照片,這裡注意了,因為相簿照片本身有一個位置,我們進行了裁剪後,要給一個裁剪後的位置,
     *   不然onActivityResult方法中,data一直是null
     */
if (type == CAMERA_OK) {
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
} else {
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(bitfile));
}
    startActivityForResult(intent, CUT_OK);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    System.out.println("requestCode = " + requestCode);
    switch (requestCode) {
        // 如果是直接從相簿獲取
case ALBUM_OK:
            //從相簿中獲取到圖片了,才執行裁剪動作
if (data != null) {
                clipPhoto(data.getData(), ALBUM_OK);
//setPicToView(data);
}
            break;
// 如果是呼叫相機拍照時
case CAMERA_OK:
            // 當拍照到照片時進行裁減,否則不執行操作
if (bitfile.exists()) {
                clipPhoto(Uri.fromFile(bitfile), CAMERA_OK);//開始裁減圖片
}
            break;
// 取得裁剪後的圖片,這裡將其設定到imageview中
case CUT_OK:
            /**
             * 非空判斷大家一定要驗證,如果不驗證的話, 在剪裁之後如果發現不滿意,
             * 要重新裁剪,丟棄 當前功能時,會報NullException
             */
if (data != null) {
                try {
                    //   Bitmap bm = BitmapFactory.decodeStream(getContentResolver().openInputStream(data.getData()));
                    //   i1.setImageBitmap(bitmap);
Bitmap bm = BitmapFactory.decodeFile(bitfile.getAbsolutePath());
//這裡獲取了Bitmap,就可以進行顯示操作,而一般上傳去網上,可以使用檔案路徑bitfile.getAbsolutePath(),
// 這不推薦用data進行資料操作,特別因為華為手機方法與其他手機不一致,容易bug。
mRoundImageView2.setImageBitmap(bm);Qiuutil.LogE(Uri.fromFile(bitfile) + ":" + bitfile.getAbsolutePath());} catch (Exception ex) { ex.printStackTrace();} } else { Log.e("圖片資料獲取Main", "data為空");} break; default: break;} super.onActivityResult(requestCode, resultCode, data);}

呼叫時:

mTextView2.setOnClickListener(new View.OnClickListener() {
    @Override
public void onClick(View v) {
        //xiangji();
xiangce();
}
});

相關推薦

選擇相簿或者相機圖片裁剪小米機型

選擇圖片上傳基本是標配了,有必要寫好個通用的方法以便使用,以下是一堆程式碼,使用的時候貼上進去就可以了。 基本解決了一些常出現的問題:華為手機適配,6.0許可權申請,圖片大小控制。 1、關於許可權問題,我們使用一個開源庫: dependencies { compi

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

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

tcgames無需模擬器電腦玩手遊助手最手機機型排行榜

tcgames用什麼手機效果最好?tcgames玩刺激戰場什麼機型最流暢畫質最高清?tcgames是一款無需安卓模擬器也可以在電腦上用滑鼠鍵盤操作遊戲並且匹配手機玩家的工具。因為其不佔用電腦記憶體配置的優點是很多手遊玩家特別是刺激戰場、全軍出擊等吃雞手遊玩家和遊戲主播的首選遊戲輔助神器。 但是不

Unity快速劉海屏(又簡單又快 了O版本和P版本)

劉海屏適配,其實就是知道劉海高度(橫屏遊戲),來對ui進行偏移 所以劉海屏適配的關鍵是獲取劉海高度        NotchFit是一款Android端的劉海屏適配庫,適配了O版本和P版本,它遮蔽了不同廠商不同裝置不同系統版本對劉海屏適配帶來的一系列的

電腦玩絕地求生:刺激戰場模擬器卡頓?TC Games 完美低配置電腦

絕地求生:刺激戰場模擬器哪個好用?刺激戰場模擬器卡頓怎麼辦?很多用安卓模擬器在電腦上玩刺激戰場的玩家在操作的時候感覺延遲卡頓非常嚴重。那是因為除了安卓模擬器本身比較佔用電腦記憶體外,在安卓模擬器遊戲中心下載的每款遊戲的記憶體也不小,特別是動作射擊類遊戲,加上電腦上已有的其他軟

開源,自動縮放佈局,解決螢幕問題

2015.8.4 更新: 增加引數custom:autoScaleType 設定縮放模式,可以設為“fitWidth”,"fitHeigth" 和 "fitInside"。分別代表縮放至寬度匹配,縮放至高度匹配以及縮放至適合容器內部,預設為"fitInside"。 做過安

如何設定沉浸式狀態列,注意處理等有虛擬按鍵的問題

當前安卓開發中,基本都使用了沉浸時候狀態列,拉伸視覺體驗,增大了螢幕空間,但是如何設定沉浸式狀態列呢,這裡簡單進行介紹: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { activity

讀取相簿選取圖片壓縮

背景: 因需要從相簿中選擇照片後做其他操作,但是照片有可能較大,則需要進行壓縮。但是經過系統相簿選擇的圖片,我們獲取到的是URI,而不是實際檔案路徑。找了很多方法來將URI轉為實際路徑,最後沒有找到完善的方法。其實URI的設計,就不是讓大家將其轉化為實際路徑的,應該直接採用URI完成後續

呼叫相簿出錯不選擇圖片推出後無法再次選擇

onActivityResult加上判斷條件 若果沒有選擇返回null @Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(reques

更換使用者頭像 呼叫手機相簿相機拍照 選擇圖片裁剪

佈局   一個ImageView用來顯示處理後的頭像,兩個按鈕  分別為呼叫相機、呼叫手機相簿 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=

手機相簿出現莫名的圖片?還刪除不徹底?一招徹底清除!

不知道大家有沒有這樣的問題,就是開啟安卓的手機的相簿,有時候會出現很多莫名其妙的圖片,有時候怎麼刪除也刪除乾淨!今天小編就為大家介紹如何快速刪除的方法! 方法一:關閉手機鎖屏更新。 進入手機【設定】——【顯示】——【桌布】——【隨機切換桌布】,關閉這個功能。  

呼叫系統相機相簿、剪裁圖片上傳(常用於上傳頭像,相容Android7.0)

轉載請註明出處文章地址 本文轉自Hansion的部落格 由於在Android 7.0 採用了StrictMode API政策禁,其中有一條限制就是對目錄訪問的限制。 這項變更意味著我們無法通過File API訪問手機儲存上的資料,也就是說,給其他應用傳

選擇圖片上傳功能【支援多選拍照預覽等】

在網上找了很多第三方的相簿拍照框架,都不盡人意,最後終於找到了一個比較好的框架,並且整合到了自己的demo中,花了兩天的時間吧感覺挺值的。老規矩不說廢話,直接上程式碼。 感謝某開源庫的作者:Alum 思路 目錄 先看目錄,我儘可能的在自己力所能及的範圍

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

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

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

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

獲取軟硬件信息上傳給server(Socket實現)

獲取 acad soc 實現 環境 theme info fcm ntop 首先,項目結構如圖--A:分為client部分CheckInfo和server端CheckInfo_Server。CheckInfo獲取手機信息(Mac,Cpu,內存,已安裝軟件信息等)並上

js判斷客戶端或者是ios客戶端

終端 use navigator 判斷 com oca topic fun and 代碼:   function xaizai() {   var u = navigator.userAgent, app = navigator.appVersion;   var isA

初次完美調試,成功編程!

顯示 gettext options miss listener ptr chan 控制 列表 語言都是相通的,爽歪歪2017-12-0317:33:58 這是GosDeviceControlActivity.java的代碼 1 package com.gizwits

手機怎麽將圖片轉PDF方法

在一起 nag 簡單 頁面 新的 images mark ima sha 手機圖片太多查閱不是很方便,也很占手機的內存,這時我們何不試試將圖片轉換成PDF文件呢,我們將以內的照片放在一起然後轉換成一個PDF文件,這樣查閱起來就方便了不少。 準備工具:安卓手機先去軟件商店下載

python獲取app性能參數繪圖

read cpu 去掉 [] mps app figure ani popen from matplotlib import pyplot as plt from matplotlib import animation import os,re # import nump