【Android】图片选择(拍照+本地相册)Dialog封装,使用

作者:邹峰立,微博:zrunker,邮箱:zrunker@yahoo.com,微信公众号:书客创作,个人平台:www.ibooker.cc

本文选自书客创作平台第19篇文章。阅读原文

书客创作

对于大多数Android开发者来说,(拍照+本地相册)选择图片是再平常不过的功能,几乎每一个APP都会用到,但是现今的Android市场,机型,版本等各个方面都存在着不同,那么如何找到一个合适自己的方式呢?下面我们将封装一套属于自己的图片选择器。

一、选择图片

选择图片,无外乎拍照和本地相册选择,那么在Android手机中如何实现呢?

A、启动本地相册(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、启动拍照

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Activity.startActivity(intent);

注意:要在清单文件AndroidManifest.xml添加拍照权限android.permission.CAMERA。

二、保存选中图片

当选择图片完之后,需要将选中的图片进行保存,一般保存到一个临时文件当中。而我们的最终目的是把选中的图片,供外界使用(初始Activity/Fragment)。这个时候就要使用startActivityForResult来启动拍照或本地相册,方便进行数据回调。

如下:启动本地相册和启动拍照可以写出如下形式。

启动本地相册:

Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
Activity.startActivityForResult(intent, RESULT_LOAD _CODE);

注:RESULT_LOAD _CODE是表示启动本地相册请求码。

启动拍照:将拍照图片保存到一个临时文件当中。

try{
   if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
      //创建文件夹
      boolean isSuccess =true;
      File dirFile =new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"photoCache");
      if(!dirFile.exists()) {
         isSuccess = dirFile.mkdirs();
      }
      if(isSuccess) {
         //创建文件
         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卡不存在,请插入SD卡!", Toast.LENGTH_SHORT).show();
   }
}catch(Exception e) {
   e.printStackTrace();
}

注:这里需要自定义静态变量photoUri和静态整形常量RESULT_PHOTO _CODE。其中photoUri为Uri,是用来保存拍照URI。RESULT_PHOTO _CODE是表示启动拍照请求码。

可能存在的问题

在Android7.0+版本中,不再允许在app中把file://Uri暴露给其他app。所以如果采用临时文件的方法可能会引起的FileUriExposedException异常。可以利用FileProvider来解决这个问题。那么该如何使用FileProvider呢?这里针对启动拍照3进行修改。

首先在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是一个空类,该类继承FileProvider,没有任何结构体。

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>

修改启动拍照3:

// 启动拍照3
public static void startPhoto3(Context context) {
   try {
      if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
         // 创建文件夹
         boolean isSuccess = true;
         File dirFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "ZDialogPhotoCache");
         if (!dirFile.exists()) {
            isSuccess = dirFile.mkdirs();
         }
         if (isSuccess) {
            // 创建文件
            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);
               // 添加权限
               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卡不存在,请插入SD卡!", Toast.LENGTH_SHORT).show();
         }
   } catch (Exception e) {
      e.printStackTrace();
   }
}

在清单文件AndroidManifest.xml添加拍照权限,如果是保存到临时文件中,还要添加对文件的读写权限。

 <!--用于写入数据到扩展存储卡(SD)-->
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <!-- 往sdcard中读取数据的权限 -->
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 <!-- 在sdcard中创建/删除文件的权限 -->
 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
 <!--添加拍照权限-->
 <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:
             /**
              * 拍照回调,进行相应的逻辑处理即可
              */
             break;
         case RESULT_LOAD_CODE:
             /**
               * 从相册中选择图片回调,进行相应的逻辑处理即可
               */
             break;
     }
 }

到这里,选择图片的相关逻辑已经分析清楚,那怎么去封装图片选择功能呢?

四、封装选择图片Dialog

A、创建选择图片管理类(这里只是对上面的分析,进行进一步的封装),这里我创建一个叫做ChoosePictrueUtil的类,封装对拍照和从本地相册选择方法,如下:

/**
 * 选择图片管理类
 * Created by 邹峰立 on 2017/7/10.
 */
public class ChoosePictrueUtil {
    public static Uri photoUri;// 拍照URI,拍照相对于新生产的,所有要进行转换
    public static String imgPath;// 图片地址

    // 生成一个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);
        }
    }

    // 启动拍照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);
        }
    }

    // 启动拍照2
    public static void startPhoto2(Context context) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        ((Activity) context).startActivityForResult(intent, ZDialogConstantUtil.RESULT_PHOTO_CODE);
    }

    // 启动拍照3
    public static void startPhoto3(Context context) {
        try {
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                // 创建文件夹
                boolean isSuccess = true;
                File dirFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "ZDialogPhotoCache");
                if (!dirFile.exists()) {
                    isSuccess = dirFile.mkdirs();
                }
                if (isSuccess) {
                    // 创建文件
                    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);
                        // 添加权限
                        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卡不存在,请插入SD卡!", Toast.LENGTH_SHORT).show();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 从相册中获取1
    public static void startLocal(Context context) {
        // 调用android的图库
        Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        ((Activity) context).startActivityForResult(intent, ZDialogConstantUtil.RESULT_LOAD_CODE);
    }

    // 从相册中获取2
    public static void startLocal2(Context context) {
        // 调用android的图库
        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;// 拍照权限请求码
    public static final int PERMISSION_READ_EXTERNAL_STORAGE_REQUEST_CODE = 223;// sdcard中读取数据的权限请求码
    public static final int PERMISSION_WRITE_EXTERNAL_STORAGE_REQUEST_CODE = 224;// 写入数据到扩展存储卡(SD)请求码

    public static final int REQUEST_CROP_CODE = 10; // 裁剪请求码
    public static final int RESULT_LOAD_CODE = 11; // 从本地相册中获取
    public static final int RESULT_PHOTO_CODE = 12; // 拍照
}

B、选择图片Dialog。

选择图片Dialog

如何自定义这个Dialog呢?其实就是将一个将布局和对于操作方式封装到一个类当中即可,这里我创建一个叫做ChoosePictrueDialog的类。

首先:XML布局,对于上面的布局来说,一个线性布局包裹三个Button即可。

其实:定义一个Dialog操作类,同时要对当前布局文件内容进行操作。

思路:创建ChoosePictrueDialog,在该类中定义一个全局变量Dialog,在该类进行创建操作的时候,进行Dialog初始化,同时将初始化XML布局控件,并设置布局文件三个Button的点击事件,最后将XML文件添加到Dialog中去。

Dialog dialog=new Dialog(context, R.style.diydialog);
View view = LayoutInflater.from(context).inflate(R.layout.layout_choose_pictrue, null);
/**对于按钮的点击事件监听,这里略过。**/
dialog.setContentView(view);

这里有一个地方需要注意,由于Android 6.0之后,对权限的限制非常多,在启动拍照的时候要对SD和系统拍照进行操作,所以这里几个权限的判断必不可少。

// 启动拍照
public void startPhoto() {
     if (onPhotoListener != null) {
         onPhotoListener.onPhoto();
     } else {
         // 判断是否需要拍照权限
         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中读取数据的权限
             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 {
                 // 判断是否需要写入数据到扩展存储卡(SD)的权限
                 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 {
                     // 启动拍照
                     ChoosePictrueUtil.startPhoto3(context);
                 }
             }
         }
     }
}

在初始化Dialog的时候,细心的同学,可能看到Dialog dialog=new Dialog(context,R.style.diydialog),那么R.style.diydialog是什么呢?这个是设置Dialog主题文件,需要在styles.xml中进行书写:

<style name="diydialog" parent="@android:style/Theme.Dialog">
   <item name="android:windowFrame">@null</item>
   <!--边框-->
   <item name="android:windowIsFloating">true</item>
   <!--是否浮现在activity之上-->
   <item name="android:windowIsTranslucent">true</item>
   <!--半透明-->
   <item name="android:windowNoTitle">true</item>
   <!--无标题-->
   <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>
      <!--内容-->
      <solid android:color="#FFFFFF"/>
      <!--四角-->
      <corners android:radius="4dp"/>
      <!--边框-->
      <stroke android:width="0.6dp" android:color="#CCCCCC"/>
   </shape></item>
</layer-list>

ChoosePictrueDialog类需要对外外提供修改样式和功能的类,这些都是采用构造者模式,例如:

1、设置Dialog显示位置

Dialog在屏幕当中显示位置,无外乎上、下、左、右、中五种,这里采用枚举enum来标记几种状态,然后通过设置window.getAttributes().gravity便可实现Dialog在窗体中的位置。

public enum ChoosePictrueDialogGravity {
    GRAVITY_BOTTOM, GRAVITY_CENTER, GRAVITY_LEFT, GRAVITY_RIGHT, GRAVITY_TOP
}
/**
 * 设置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、设置背景层透明度

/**
  * 设置背景层透明度
  *
  * @param dimAmount 0~1
  */
public ChoosePictrueDialog setDimAmount(float dimAmount) {
     Window window = dialog.getWindow();
     if (window != null) {
         WindowManager.LayoutParams lp = window.getAttributes();
         // 设置背景层透明度
         lp.dimAmount = dimAmount;
         window.setAttributes(lp);
     }
     return this;
}

3、设置Window动画

/**
  * 设置Window动画
  *
  * @param style R文件
  */
public ChoosePictrueDialog setWindowAnimations(int style) {
     if (dialog != null) {
         Window window = dialog.getWindow();
         if (window != null) {
             window.setWindowAnimations(style);
         }
     }
     return this;
}

按照这样的规则,可以定义出很多方法,其他方法这里不再列出。

对选择图片的封装,到这儿就已经写完了,一共建了三个类,ZDialogConstantUtil(常量管理类)、ChoosePictrueUtil(选择图片管理类)、ChoosePictrueDialog(选择图片Dialog类)。

Github地址:
ZDialog
ZDialogConstantUtil
ChoosePictrueUtil
ChoosePictrueDialog

这里也可以直接引入该封装内容到自己的工程当中,该如何使用呢?

一、引入资源

引入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();

启动拍照将会对一些权限进行判断,所以要在启动Dialog的Activity中添加权限请求回调处理。

// 权限设置结果
@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, "获取拍照权限失败", 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中读取数据的权限失败", 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, "写入数据到扩展存储卡(SD)权限失败", Toast.LENGTH_SHORT).show();
             }
             break;
     }
}

选择图片之后,会进行图片选择结果回调,所以这里可以进行图片选择回调进行监听:

/**
 * 通过回调方法处理图片
 */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
     switch (requestCode) {
         case ZDialogConstantUtil.RESULT_PHOTO_CODE:
             /**
              * 拍照,获取返回结果
              */
             closeChoosePictrueDialog();
             Uri photoUri = ChoosePictrueUtil.photoUri;
             if (photoUri != null) {
                /**
                 * 拍照回调,进行相应的逻辑处理即可
                 */
             }
             break;
         case ZDialogConstantUtil.RESULT_LOAD_CODE:
             /**
              * 从相册中选择图片,获取返回结果
              */
             closeChoosePictrueDialog();
             if (data == null) {
                 return;
             } else {
                 Uri uri = data.getData();// 获取图片是以content开头
                 if (uri != null) {
                     // 进行相应的逻辑操作
                 }
             }
             break;
         }
    }
}
// 关闭选择图片Dialog
private void closeChoosePictrueDialog() {
    if (choosePictrueDialog != null)
        choosePictrueDialog.closeChoosePictrueDialog();
}

三、其他方法使用(如下只是部分方法)

/**
 *设置三个按钮的字体颜色
 *@param color颜色值16进制
 */
public ChoosePictrueDialog setBtnColor(String color);

/**
 *设置三个按钮的字体大小
 *@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不取消  默认true
 */
public ChoosePictrueDialog setCancelable(boolean cancelable)

/**
 *点击Dialog外围是否取消
 *@param cancelable true取消false不取消  默认false
 */
public ChoosePictrueDialog setCanceledOnTouchOutside(boolean cancelable)

/**
 *设置取消事件
 *@param onCancelListener取消事件
 */
public ChoosePictrueDialog setOnCancelListener(DialogInterface.OnCancelListener  onCancelListener)

/**
 *设置Dialog显示位置
 *@param choosePictrueDialogGravity左上右下中
 */
public ChoosePictrueDialog setChoosePictrueDialogGravity(ChoosePictrueDialogGravity  choosePictrueDialogGravity)

/**
 *设置背景层透明度
 *@param dimAmount0~1
 */
public ChoosePictrueDialog setDimAmount(float dimAmount)

/**
 *设置Window动画
 *@param style R文件
 */
public ChoosePictrueDialog setWindowAnimations(int style)

/**
 *设置Dialog宽度
 *@param proportion和屏幕的宽度比(10代表10%) 0~100
 */
public ChoosePictrueDialog setChoosePictrueDialogWidth(int proportion)

/**
 *设置Dialog高度
 *@param proportion和屏幕的高度比(10代表10%) 0~100
 */
public ChoosePictrueDialog setChoosePictrueDialogHeight(int proportion);

/**
 *展示Dialog
 */
public void showChoosePictrueDialog();

/**
 *关闭Dialog
 */
public void closeChoosePictrueDialog();

// 本地相册按钮点击事件
public void setOnLocalListener(OnLocalListener onLocalListener);

// 拍照按钮点击事件
public void setOnPhotoListener(OnPhotoListener onPhotoListener);

// 取消按钮点击事件
public void setOnCancelListener(OnCancelListener onCancelListener);

阅读原文


微信公众号:书客创作
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容