【Android】圖片選擇(拍照+本地相冊(cè))Dialog封裝吴趴,使用

作者:鄒峰立,微博:zrunker侮攀,郵箱:zrunker@yahoo.com锣枝,微信公眾號(hào):書客創(chuàng)作,個(gè)人平臺(tái):www.ibooker.cc魏身。

本文選自書客創(chuàng)作平臺(tái)第19篇文章惊橱。閱讀原文

書客創(chuàng)作

對(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豆瘫。

選擇圖片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)遣总;

閱讀原文


微信公眾號(hào):書客創(chuàng)作
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末睬罗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子旭斥,更是在濱河造成了極大的恐慌傅物,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琉预,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蒿褂,警方通過查閱死者的電腦和手機(jī)圆米,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啄栓,“玉大人娄帖,你說我怎么就攤上這事£汲” “怎么了近速?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)堪旧。 經(jīng)常有香客問我削葱,道長(zhǎng),這世上最難降的妖魔是什么淳梦? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任析砸,我火速辦了婚禮,結(jié)果婚禮上爆袍,老公的妹妹穿的比我還像新娘首繁。我一直安慰自己作郭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布弦疮。 她就那樣靜靜地躺著夹攒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胁塞。 梳的紋絲不亂的頭發(fā)上咏尝,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音闲先,去河邊找鬼状土。 笑死,一個(gè)胖子當(dāng)著我的面吹牛伺糠,可吹牛的內(nèi)容都是我干的蒙谓。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼训桶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼累驮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舵揭,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谤专,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后午绳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體置侍,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年拦焚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜡坊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赎败,死狀恐怖秕衙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情僵刮,我是刑警寧澤据忘,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站搞糕,受9級(jí)特大地震影響勇吊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寞宫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一萧福、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辈赋,春花似錦鲫忍、人聲如沸膏燕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)坝辫。三九已至,卻和暖如春射亏,著一層夾襖步出監(jiān)牢的瞬間近忙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工智润, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留及舍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓窟绷,卻偏偏與公主長(zhǎng)得像锯玛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兼蜈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容