头像选取的两种方式 拍照和系统相册选取
QQ图片20180527222039.jpg点击用户头像,弹出选择框,让用户选择 拍照选取 还是相册选取。
下面的代码是弹出选择框
private void initMyPhoto() {
//弹出选择框
String[] strings = {"拍照", "从相机选择"};
yourchoice = 0;
AlertDialog.Builder singleChoiceDialog = new AlertDialog.Builder(MeInformActivity.this);
singleChoiceDialog.setTitle("请选择头像");
singleChoiceDialog.setSingleChoiceItems(strings, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
yourchoice = which;
}
});
singleChoiceDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (yourchoice == 0) {
//拍照
chooseCameraphoto();
} else if (yourchoice == 1) {
//从相机选择照片
chooseLocalphoto();
}
}
});
singleChoiceDialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
singleChoiceDialog.show();
}
然后定义两个作为请求码的常量和一个图片的uri,后面会用到
/* 请求识别码 */
private static final int CODE_GALLERY_REQUEST = 0xa0;
private static final int CODE_CAMERA_REQUEST = 0xa1;
/* 图片的uri路径 */
private Uri uri;
下面代码是用相机拍照选取头像
private void chooseCameraphoto() {
//新建一个临时文件存放图片
File outputFile = new File(getExternalCacheDir(),
"newFile.jpg");
try {
if(outputFile.exists()){
outputFile.delete();
}
outputFile.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 判断存储卡是否可用,存储照片文件
if (hasSdcard()) {
uri = getUriForFile(MeInformActivity.this,outputFile);
intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, getUriForFile(MeInformActivity.this,outputFile));
}
startActivityForResult(intentFromCapture, CODE_CAMERA_REQUEST);
}
下面代码是判断存储卡是否可用
private boolean hasSdcard() {
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
// 有存储的SDCard
return true;
} else {
return false;
}
}
下面代码是根据file对象返回一个系统的Uri对象
private static Uri getUriForFile(Context context, File file) {
if (context == null || file == null) {
throw new NullPointerException();
}
Uri uri;
if (Build.VERSION.SDK_INT >= 24) {
uri = FileProvider.getUriForFile(context.getApplicationContext(), "com.example.onlineclassroom.fileprovider", file);
Log.e("uri",uri+"");
} else {
uri = Uri.fromFile(file);
}
return uri;
}
当调用 FileProvider.getUriForFile的内容提供器的时候,我们要提前在manifests里面声明内容提供器,代码如下
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.onlineclassroom.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
上面引用到的file_paths的文件如下
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="files_path" path="/"/>
</paths>
下面代码打开系统相册选取头像
private void chooseLocalphoto() {
/*
从android6.0(API级别23)开始,系统权限分为两类:正常权限和危险权限读写内存卡被识别为危险操作,
所以需要动态向用户请求访问内存的权限
具体的步骤
(1) 调用ContextCompat.checkSelfPermission() 方法检查用户是否具有这样的权限
(2) 调用requestPermissions() 方法请求权限,,系统将向用户显示一个对话框
(3) 当用户响应时,系统将调用应用的 onRequestPermissionsResult() 方法
*/
int permissionCheck = ContextCompat.checkSelfPermission(MeInformActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
Log.e("permissionCheck",permissionCheck+"");
if(permissionCheck == -1) {
//当没有权限
ActivityCompat.requestPermissions(MeInformActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}else{
//当有权限
Intent intentFromGallery = new Intent();
// 设置文件类型
intentFromGallery.setType("image/*");
//ACTION_GET_CONTENT:允许用户选择特殊种类的数据,并返回(特殊种类的数据:照一张相片或录一段音)
intentFromGallery.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intentFromGallery, CODE_GALLERY_REQUEST);
}
}
下面是动态申请权限
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case MY_PERMISSIONS_REQUEST_READ_CONTACTS:
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//当获得权限后再调用系统相册
chooseLocalphoto();
}
break;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
下面代码 根据请求码的不同执行不同的操作
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
switch (requestCode) {
case CODE_GALLERY_REQUEST:
//调用本地相册
if(intent != null){
//系统返回的是一个媒体文件的Uri,我们需转换成真实的图片路径
String imagePath = handleImageOnKitKat(intent);
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
header_im1.setImageBitmap(bitmap);
}
break;
case CODE_CAMERA_REQUEST:
//拍照
//拍照返回的是一个file类型,所以直接调用getPath方法则返回真实路径
String imagePath2 = uri.getPath();
Bitmap bitmap2 = BitmapFactory.decodeFile(imagePath2);
header_im1.setImageBitmap(bitmap2);
break;
}
super.onActivityResult(requestCode, resultCode, intent);
}
以上就是选择头像的所有代码了,如有帮助请点个赞吧!!!
如有问题,欢迎留言讨论!!!
网友评论