作者:鄒峰立,微博:zrunker侮攀,郵箱:zrunker@yahoo.com锣枝,微信公眾號(hào):書客創(chuàng)作,個(gè)人平臺(tái):www.ibooker.cc魏身。
本文選自書客創(chuàng)作平臺(tái)第19篇文章惊橱。閱讀原文 。
對(duì)于大多數(shù)Android開發(fā)者來說箭昵,(拍照+本地相冊(cè))選擇圖片是再平常不過的功能税朴,幾乎每一個(gè)APP都會(huì)用到,但是現(xiàn)今的Android市場(chǎng),機(jī)型正林,版本等各個(gè)方面都存在著不同泡一,那么如何找到一個(gè)合適自己的方式呢?下面我們將封裝一套屬于自己的圖片選擇器觅廓。
一鼻忠、選擇圖片
選擇圖片,無外乎拍照和本地相冊(cè)選擇杈绸,那么在Android手機(jī)中如何實(shí)現(xiàn)呢帖蔓?
A、啟動(dòng)本地相冊(cè)(2種方式)
第一種方式:
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
Activity.startActivity(intent);
第二種方式:
Intent intent =new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
Activity.startActivity(intent);
B瞳脓、啟動(dòng)拍照
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Activity.startActivity(intent);
注意:要在清單文件AndroidManifest.xml添加拍照權(quán)限android.permission.CAMERA塑娇。
二、保存選中圖片
當(dāng)選擇圖片完之后劫侧,需要將選中的圖片進(jìn)行保存埋酬,一般保存到一個(gè)臨時(shí)文件當(dāng)中。而我們的最終目的是把選中的圖片烧栋,供外界使用(初始Activity/Fragment)写妥。這個(gè)時(shí)候就要使用startActivityForResult來啟動(dòng)拍照或本地相冊(cè),方便進(jìn)行數(shù)據(jù)回調(diào)审姓。
如下:?jiǎn)?dòng)本地相冊(cè)和啟動(dòng)拍照可以寫出如下形式珍特。
啟動(dòng)本地相冊(cè):
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
Activity.startActivityForResult(intent, RESULT_LOAD _CODE);
注:RESULT_LOAD _CODE是表示啟動(dòng)本地相冊(cè)請(qǐng)求碼。
啟動(dòng)拍照:將拍照?qǐng)D片保存到一個(gè)臨時(shí)文件當(dāng)中邑跪。
try{
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//創(chuàng)建文件夾
boolean isSuccess =true;
File dirFile =new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"photoCache");
if(!dirFile.exists()) {
isSuccess = dirFile.mkdirs();
}
if(isSuccess) {
//創(chuàng)建文件
String imgPath= dirFile.getAbsolutePath() + File.separator+ System.currentTimeMillis() +".png";
File imgFile = new File(imgPath);
Uri photoUri= Uri.fromFile(imgFile);
Intent openCameraIntent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
Activity.startActivityForResult(openCameraIntent, RESULT_PHOTO_CODE);
}
} else {
Toast.makeText(context,"SD卡不存在,請(qǐng)插入SD卡次坡!", Toast.LENGTH_SHORT).show();
}
}catch(Exception e) {
e.printStackTrace();
}
注:這里需要自定義靜態(tài)變量photoUri和靜態(tài)整形常量RESULT_PHOTO _CODE。其中photoUri為Uri画畅,是用來保存拍照URI砸琅。RESULT_PHOTO _CODE是表示啟動(dòng)拍照請(qǐng)求碼。
可能存在的問題
在Android7.0+版本中轴踱,不再允許在app中把file://Uri暴露給其他app症脂。所以如果采用臨時(shí)文件的方法可能會(huì)引起的FileUriExposedException異常∫В可以利用FileProvider來解決這個(gè)問題诱篷。那么該如何使用FileProvider呢?這里針對(duì)啟動(dòng)拍照3進(jìn)行修改雳灵。
首先在AndroidManifest.xml清單文件中添加以下代碼:
<!--Android7.0+用于訪問外部文件 -->
<provider
android:name=".ZFileProvider"
android:authorities="cc.ibooker.zdialoglib.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/zdialog_file_paths" />
</provider>
ZFileProvider是一個(gè)空類棕所,該類繼承FileProvider,沒有任何結(jié)構(gòu)體悯辙。
import android.support.v4.content.FileProvider;
/**
* 自定義FileProvider
* Created by 鄒峰立 on 2017/11/9.
*/
public class ZFileProvider extends FileProvider {
}
zdialog_file _paths文件為res/xml/中的文件:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="ZDialogPhotoCache"
path="ZDialogPhotoCache" />
</paths>
修改啟動(dòng)拍照3:
// 啟動(dòng)拍照3
public static void startPhoto3(Context context) {
try {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
// 創(chuàng)建文件夾
boolean isSuccess = true;
File dirFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "ZDialogPhotoCache");
if (!dirFile.exists()) {
isSuccess = dirFile.mkdirs();
}
if (isSuccess) {
// 創(chuàng)建文件
imgPath = dirFile.getAbsolutePath() + File.separator + System.currentTimeMillis() + ".png";
File imgFile = new File(imgPath);
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 判斷是否是AndroidN以及更高的版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
photoUri = ZFileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", imgFile);
// 添加權(quán)限
openCameraIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else
photoUri = Uri.fromFile(imgFile);
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
((Activity) context).startActivityForResult(openCameraIntent, ZDialogConstantUtil.RESULT_PHOTO_CODE);
}
} else {
Toast.makeText(context, "SD卡不存在,請(qǐng)插入SD卡琳省!", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
在清單文件AndroidManifest.xml添加拍照權(quán)限迎吵,如果是保存到臨時(shí)文件中,還要添加對(duì)文件的讀寫權(quán)限针贬。
<!--用于寫入數(shù)據(jù)到擴(kuò)展存儲(chǔ)卡(SD)-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 往sdcard中讀取數(shù)據(jù)的權(quán)限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 在sdcard中創(chuàng)建/刪除文件的權(quán)限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!--添加拍照權(quán)限-->
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
三击费、接收返回值
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case RESULT_PHOTO_CODE:
/**
* 拍照回調(diào),進(jìn)行相應(yīng)的邏輯處理即可
*/
break;
case RESULT_LOAD_CODE:
/**
* 從相冊(cè)中選擇圖片回調(diào)桦他,進(jìn)行相應(yīng)的邏輯處理即可
*/
break;
}
}
到這里蔫巩,選擇圖片的相關(guān)邏輯已經(jīng)分析清楚,那怎么去封裝圖片選擇功能呢快压?
四圆仔、封裝選擇圖片Dialog
A、創(chuàng)建選擇圖片管理類(這里只是對(duì)上面的分析嗓节,進(jìn)行進(jìn)一步的封裝)荧缘,這里我創(chuàng)建一個(gè)叫做ChoosePictrueUtil的類,封裝對(duì)拍照和從本地相冊(cè)選擇方法拦宣,如下:
/**
* 選擇圖片管理類
* Created by 鄒峰立 on 2017/7/10.
*/
public class ChoosePictrueUtil {
public static Uri photoUri;// 拍照URI,拍照相對(duì)于新生產(chǎn)的信姓,所有要進(jìn)行轉(zhuǎn)換
public static String imgPath;// 圖片地址
// 生成一個(gè)URI地址
public static Uri createImageViewUri(Context context) {
String name = "tmp" + System.currentTimeMillis();
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, name);
values.put(MediaStore.Images.Media.DISPLAY_NAME, name + ".png");
values.put(MediaStore.Images.Media.MIME_TYPE, "image/*");
return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}
// 刪除URI
public static void deleteUri(Context context, Uri uri) {
if (uri != null) {
context.getContentResolver().delete(uri, null, null);
}
}
// 啟動(dòng)拍照1
public static void startPhoto(Context context) {
photoUri = createImageViewUri(context);
if (photoUri != null) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); // 將拍照后的圖像保存到photoUri
((Activity) context).startActivityForResult(intent, ZDialogConstantUtil.RESULT_PHOTO_CODE);
}
}
// 啟動(dòng)拍照2
public static void startPhoto2(Context context) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
((Activity) context).startActivityForResult(intent, ZDialogConstantUtil.RESULT_PHOTO_CODE);
}
// 啟動(dòng)拍照3
public static void startPhoto3(Context context) {
try {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
// 創(chuàng)建文件夾
boolean isSuccess = true;
File dirFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "ZDialogPhotoCache");
if (!dirFile.exists()) {
isSuccess = dirFile.mkdirs();
}
if (isSuccess) {
// 創(chuàng)建文件
imgPath = dirFile.getAbsolutePath() + File.separator + System.currentTimeMillis() + ".png";
File imgFile = new File(imgPath);
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 判斷是否是AndroidN以及更高的版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
photoUri = ZFileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", imgFile);
// 添加權(quán)限
openCameraIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else
photoUri = Uri.fromFile(imgFile);
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
((Activity) context).startActivityForResult(openCameraIntent, ZDialogConstantUtil.RESULT_PHOTO_CODE);
}
} else {
Toast.makeText(context, "SD卡不存在,請(qǐng)插入SD卡鸵隧!", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 從相冊(cè)中獲取1
public static void startLocal(Context context) {
// 調(diào)用android的圖庫(kù)
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
((Activity) context).startActivityForResult(intent, ZDialogConstantUtil.RESULT_LOAD_CODE);
}
// 從相冊(cè)中獲取2
public static void startLocal2(Context context) {
// 調(diào)用android的圖庫(kù)
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
((Activity) context).startActivityForResult(intent, ZDialogConstantUtil.RESULT_LOAD_CODE);
}
}
注:其中ZDialogConstantUtil類是用來保存常量。
/**
* 常量管理類
* Created by 鄒峰立 on 2017/7/10.
*/
public class ZDialogConstantUtil {
public static final int PERMISSION_CAMERA_REQUEST_CODE = 222;// 拍照權(quán)限請(qǐng)求碼
public static final int PERMISSION_READ_EXTERNAL_STORAGE_REQUEST_CODE = 223;// sdcard中讀取數(shù)據(jù)的權(quán)限請(qǐng)求碼
public static final int PERMISSION_WRITE_EXTERNAL_STORAGE_REQUEST_CODE = 224;// 寫入數(shù)據(jù)到擴(kuò)展存儲(chǔ)卡(SD)請(qǐng)求碼
public static final int REQUEST_CROP_CODE = 10; // 裁剪請(qǐng)求碼
public static final int RESULT_LOAD_CODE = 11; // 從本地相冊(cè)中獲取
public static final int RESULT_PHOTO_CODE = 12; // 拍照
}
B意推、選擇圖片Dialog豆瘫。
如何自定義這個(gè)Dialog呢?其實(shí)就是將一個(gè)將布局和對(duì)于操作方式封裝到一個(gè)類當(dāng)中即可菊值,這里我創(chuàng)建一個(gè)叫做ChoosePictrueDialog的類外驱。
首先:XML布局,對(duì)于上面的布局來說腻窒,一個(gè)線性布局包裹三個(gè)Button即可昵宇。
其實(shí):定義一個(gè)Dialog操作類,同時(shí)要對(duì)當(dāng)前布局文件內(nèi)容進(jìn)行操作儿子。
思路:創(chuàng)建ChoosePictrueDialog瓦哎,在該類中定義一個(gè)全局變量Dialog,在該類進(jìn)行創(chuàng)建操作的時(shí)候柔逼,進(jìn)行Dialog初始化蒋譬,同時(shí)將初始化XML布局控件,并設(shè)置布局文件三個(gè)Button的點(diǎn)擊事件愉适,最后將XML文件添加到Dialog中去犯助。
Dialog dialog=new Dialog(context, R.style.diydialog);
View view = LayoutInflater.from(context).inflate(R.layout.layout_choose_pictrue, null);
/**對(duì)于按鈕的點(diǎn)擊事件監(jiān)聽,這里略過维咸。**/
dialog.setContentView(view);
這里有一個(gè)地方需要注意剂买,由于Android 6.0之后惠爽,對(duì)權(quán)限的限制非常多,在啟動(dòng)拍照的時(shí)候要對(duì)SD和系統(tǒng)拍照進(jìn)行操作雷恃,所以這里幾個(gè)權(quán)限的判斷必不可少疆股。
// 啟動(dòng)拍照
public void startPhoto() {
if (onPhotoListener != null) {
onPhotoListener.onPhoto();
} else {
// 判斷是否需要拍照權(quán)限
int checkCallPhonePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA);
if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.CAMERA}, ZDialogConstantUtil.PERMISSION_CAMERA_REQUEST_CODE);
} else {
// 判斷是否需要sdcard中讀取數(shù)據(jù)的權(quán)限
int checkCallSDReadPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);
if (checkCallSDReadPermission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, ZDialogConstantUtil.PERMISSION_READ_EXTERNAL_STORAGE_REQUEST_CODE);
} else {
// 判斷是否需要寫入數(shù)據(jù)到擴(kuò)展存儲(chǔ)卡(SD)的權(quán)限
int checkCallSDWritePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (checkCallSDWritePermission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, ZDialogConstantUtil.PERMISSION_WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
} else {
// 啟動(dòng)拍照
ChoosePictrueUtil.startPhoto3(context);
}
}
}
}
}
在初始化Dialog的時(shí)候,細(xì)心的同學(xué)倒槐,可能看到Dialog dialog=new Dialog(context,R.style.diydialog)旬痹,那么R.style.diydialog是什么呢?這個(gè)是設(shè)置Dialog主題文件讨越,需要在styles.xml中進(jìn)行書寫:
<style name="diydialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<!--邊框-->
<item name="android:windowIsFloating">true</item>
<!--是否浮現(xiàn)在activity之上-->
<item name="android:windowIsTranslucent">true</item>
<!--半透明-->
<item name="android:windowNoTitle">true</item>
<!--無標(biāo)題-->
<item name="android:windowBackground">@drawable/bg_white_gray_border</item>
<!--背景-->
<item name="android:backgroundDimEnabled">true</item>
<!--是否為半透明-->
</style>
至于bg_white_gray_border為背景文件两残,是在drawable文件夾下:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item><shape>
<!--內(nèi)容-->
<solid android:color="#FFFFFF"/>
<!--四角-->
<corners android:radius="4dp"/>
<!--邊框-->
<stroke android:width="0.6dp" android:color="#CCCCCC"/>
</shape></item>
</layer-list>
ChoosePictrueDialog類需要對(duì)外外提供修改樣式和功能的類,這些都是采用構(gòu)造者模式把跨,例如:
1人弓、設(shè)置Dialog顯示位置
Dialog在屏幕當(dāng)中顯示位置,無外乎上着逐、下崔赌、左、右耸别、中五種健芭,這里采用枚舉enum來標(biāo)記幾種狀態(tài),然后通過設(shè)置window.getAttributes().gravity便可實(shí)現(xiàn)Dialog在窗體中的位置秀姐。
public enum ChoosePictrueDialogGravity {
GRAVITY_BOTTOM, GRAVITY_CENTER, GRAVITY_LEFT, GRAVITY_RIGHT, GRAVITY_TOP
}
/**
* 設(shè)置Dialog顯示位置
*
* @param choosePictrueDialogGravity 左上右下中
*/
public ChoosePictrueDialog setChoosePictrueDialogGravity(ChoosePictrueDialogGravity choosePictrueDialogGravity) {
Window window = dialog.getWindow();
int gravity = Gravity.CENTER;
if (choosePictrueDialogGravity == ChoosePictrueDialogGravity.GRAVITY_BOTTOM) {
gravity = Gravity.BOTTOM;
} else if (choosePictrueDialogGravity == ChoosePictrueDialogGravity.GRAVITY_CENTER) {
gravity = Gravity.CENTER;
} else if (choosePictrueDialogGravity == ChoosePictrueDialogGravity.GRAVITY_LEFT) {
gravity = Gravity.START;
} else if (choosePictrueDialogGravity == ChoosePictrueDialogGravity.GRAVITY_RIGHT) {
gravity = Gravity.END;
} else if (choosePictrueDialogGravity == ChoosePictrueDialogGravity.GRAVITY_TOP) {
gravity = Gravity.TOP;
}
if (window != null)
window.getAttributes().gravity = gravity;
return this;
}
2慈迈、設(shè)置背景層透明度
/**
* 設(shè)置背景層透明度
*
* @param dimAmount 0~1
*/
public ChoosePictrueDialog setDimAmount(float dimAmount) {
Window window = dialog.getWindow();
if (window != null) {
WindowManager.LayoutParams lp = window.getAttributes();
// 設(shè)置背景層透明度
lp.dimAmount = dimAmount;
window.setAttributes(lp);
}
return this;
}
3、設(shè)置Window動(dòng)畫
/**
* 設(shè)置Window動(dòng)畫
*
* @param style R文件
*/
public ChoosePictrueDialog setWindowAnimations(int style) {
if (dialog != null) {
Window window = dialog.getWindow();
if (window != null) {
window.setWindowAnimations(style);
}
}
return this;
}
按照這樣的規(guī)則省有,可以定義出很多方法痒留,其他方法這里不再列出。
對(duì)選擇圖片的封裝蠢沿,到這兒就已經(jīng)寫完了伸头,一共建了三個(gè)類,ZDialogConstantUtil(常量管理類)搏予、ChoosePictrueUtil(選擇圖片管理類)熊锭、ChoosePictrueDialog(選擇圖片Dialog類)。
Github地址:
ZDialog雪侥,
ZDialogConstantUtil碗殷,
ChoosePictrueUtil,
ChoosePictrueDialog
這里也可以直接引入該封裝內(nèi)容到自己的工程當(dāng)中速缨,該如何使用呢锌妻?
一、引入資源
引入Android Studio:
在build.gradle文件中添加以下代碼:
allprojects {
repositories {
maven { url 'https://www.jitpack.io' }
}
}
dependencies {
compile 'com.github.zrunker:ZDialog:v1.0.0'
}
或Maven引入旬牲,在pom.xml文件中添加以下代碼:
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependency>
<groupId>com.github.zrunker</groupId>
<artifactId>ZDialog</artifactId>
<version>v1.0.0</version>
</dependency>
二仿粹、使用
// 初始化
ChoosePictrueDialog choosePictrueDialog=new ChoosePictrueDialog(this)搁吓;
choosePictrueDialog.showChoosePictrueDialog();
啟動(dòng)拍照將會(huì)對(duì)一些權(quán)限進(jìn)行判斷,所以要在啟動(dòng)Dialog的Activity中添加權(quán)限請(qǐng)求回調(diào)處理吭历。
// 權(quán)限設(shè)置結(jié)果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case ZDialogConstantUtil.PERMISSION_CAMERA_REQUEST_CODE:
if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
choosePictrueDialog.startPhoto();
} else {
Toast.makeText(this, "獲取拍照權(quán)限失敗", Toast.LENGTH_SHORT).show();
}
break;
case ZDialogConstantUtil.PERMISSION_READ_EXTERNAL_STORAGE_REQUEST_CODE:
if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
choosePictrueDialog.startPhoto();
} else {
Toast.makeText(this, "sdcard中讀取數(shù)據(jù)的權(quán)限失敗", Toast.LENGTH_SHORT).show();
}
break;
case ZDialogConstantUtil.PERMISSION_WRITE_EXTERNAL_STORAGE_REQUEST_CODE:
if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
choosePictrueDialog.startPhoto();
} else {
Toast.makeText(this, "寫入數(shù)據(jù)到擴(kuò)展存儲(chǔ)卡(SD)權(quán)限失敗", Toast.LENGTH_SHORT).show();
}
break;
}
}
選擇圖片之后堕仔,會(huì)進(jìn)行圖片選擇結(jié)果回調(diào),所以這里可以進(jìn)行圖片選擇回調(diào)進(jìn)行監(jiān)聽:
/**
* 通過回調(diào)方法處理圖片
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case ZDialogConstantUtil.RESULT_PHOTO_CODE:
/**
* 拍照晌区,獲取返回結(jié)果
*/
closeChoosePictrueDialog();
Uri photoUri = ChoosePictrueUtil.photoUri;
if (photoUri != null) {
/**
* 拍照回調(diào)摩骨,進(jìn)行相應(yīng)的邏輯處理即可
*/
}
break;
case ZDialogConstantUtil.RESULT_LOAD_CODE:
/**
* 從相冊(cè)中選擇圖片,獲取返回結(jié)果
*/
closeChoosePictrueDialog();
if (data == null) {
return;
} else {
Uri uri = data.getData();// 獲取圖片是以content開頭
if (uri != null) {
// 進(jìn)行相應(yīng)的邏輯操作
}
}
break;
}
}
}
// 關(guān)閉選擇圖片Dialog
private void closeChoosePictrueDialog() {
if (choosePictrueDialog != null)
choosePictrueDialog.closeChoosePictrueDialog();
}
三朗若、其他方法使用(如下只是部分方法)
/**
*設(shè)置三個(gè)按鈕的字體顏色
*@param color顏色值16進(jìn)制
*/
public ChoosePictrueDialog setBtnColor(String color);
/**
*設(shè)置三個(gè)按鈕的字體大小
*@param size字體大小值
*/
public ChoosePictrueDialog setBtnSize(float size);
/**
*修改本地按鈕文本顏色
*@param color文本顏色
*/
public ChoosePictrueDialog setLocalBtnColor(String color);
/**
*修改拍照按鈕文本顏色
*@param color文本顏色
*/
public ChoosePictrueDialog setPhotoBtnColor(String color);
/**
*修改取消按鈕文本顏色
*@param color文本顏色
*/
public ChoosePictrueDialog setCancelBtnColor(String color);
/**
*修改本地按鈕文本字體大小
*@param size字體大小
*/
public ChoosePictrueDialog setLocalBtnSize(float size)
/**
*修改拍照按鈕文本字體大小
*@param size字體大小
*/
public ChoosePictrueDialog setPhotoBtnSize(float size)
/**
*修改取消按鈕文本字體大小
*@param size字體大小
*/
public ChoosePictrueDialog setCancelBtnSize(float size)
/**
*修改本地按鈕文本
*@param text文本信息
*/
public ChoosePictrueDialog setLocalBtnText(String text)
/**
*修改拍照按鈕文本
*@param text文本信息
*/
public ChoosePictrueDialog setPhotoBtnText(String text)
/**
*修改取消按鈕文本
*@param text文本信息
*/
public ChoosePictrueDialog setCancelBtnText(String text)
/**
*按返回鍵是否取消
*@param cancelable true取消false不取消 默認(rèn)true
*/
public ChoosePictrueDialog setCancelable(boolean cancelable)
/**
*點(diǎn)擊Dialog外圍是否取消
*@param cancelable true取消false不取消 默認(rèn)false
*/
public ChoosePictrueDialog setCanceledOnTouchOutside(boolean cancelable)
/**
*設(shè)置取消事件
*@param onCancelListener取消事件
*/
public ChoosePictrueDialog setOnCancelListener(DialogInterface.OnCancelListener onCancelListener)
/**
*設(shè)置Dialog顯示位置
*@param choosePictrueDialogGravity左上右下中
*/
public ChoosePictrueDialog setChoosePictrueDialogGravity(ChoosePictrueDialogGravity choosePictrueDialogGravity)
/**
*設(shè)置背景層透明度
*@param dimAmount0~1
*/
public ChoosePictrueDialog setDimAmount(float dimAmount)
/**
*設(shè)置Window動(dòng)畫
*@param style R文件
*/
public ChoosePictrueDialog setWindowAnimations(int style)
/**
*設(shè)置Dialog寬度
*@param proportion和屏幕的寬度比(10代表10%) 0~100
*/
public ChoosePictrueDialog setChoosePictrueDialogWidth(int proportion)
/**
*設(shè)置Dialog高度
*@param proportion和屏幕的高度比(10代表10%) 0~100
*/
public ChoosePictrueDialog setChoosePictrueDialogHeight(int proportion)恼五;
/**
*展示Dialog
*/
public void showChoosePictrueDialog();
/**
*關(guān)閉Dialog
*/
public void closeChoosePictrueDialog()哭懈;
// 本地相冊(cè)按鈕點(diǎn)擊事件
public void setOnLocalListener(OnLocalListener onLocalListener)灾馒;
// 拍照按鈕點(diǎn)擊事件
public void setOnPhotoListener(OnPhotoListener onPhotoListener);
// 取消按鈕點(diǎn)擊事件
public void setOnCancelListener(OnCancelListener onCancelListener)遣总;