第一种:从相机进行拍摄,选择照片作为头像放置imageview。
第二种:从手机相册中选择图片,进行选择照片作为头像。
public class MainActivity extends AppCompatActivity {
@Bind(R.id.take_photo)
Button takePhoto;
@Bind(R.id.img_one)
ImageView imgOne;
@Bind(R.id.select_photo)
Button selectPhoto;
private Uri imageUri;
public static final int TAKE_PHOTO = 1;
public static final int CHOOSE_PHOTO = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
takePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
try {
if (outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT >= 24) {
imageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.chenxuanhe." +
"cameratest", outputImage);
} else {
imageUri = Uri.fromFile(outputImage);
}
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, TAKE_PHOTO);
}
});
selectPhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
} else {
openAlbum();
}
}
});
}
/**
* 授权返回的结果,case 1 是申请权限的唯一请求码,结果封装在granrResult数组里面
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){
switch(requestCode){
case 1:
if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
openAlbum();
}else {
Toast.makeText(this, "你禁止了权限无法打开相册", Toast.LENGTH_SHORT).show();
}
break;
default:
// break;
}
}
/**
* 打开相册的操作
*/
private void openAlbum() {
Intent intent = new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent, CHOOSE_PHOTO);
}
/**
* 对照相返回的结果码操作
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case TAKE_PHOTO:
if (resultCode == RESULT_OK) {//这个OK是系统返回的
try {
Bitmap bitmap = BitmapFactory.decodeStream(
getContentResolver().openInputStream(imageUri));
imgOne.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
case CHOOSE_PHOTO:
if (resultCode == RESULT_OK) {
//android版本4.4上下有区别,4.4之后封装路径,4.4之前真实路径
if (Build.VERSION.SDK_INT >= 19) {
handleImageOnKitkat(data);
} else {
handleImageBeforeKitKat(data);
}
}
break;
default:
break;
}
}
/**
* 从相册选择照片作为展示图片
* @param imagePath
*/
private void displayImage(String imagePath) {
if (imagePath != null) {
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
imgOne.setImageBitmap(bitmap);//将bitmap设置imageview图片
} else {
Toast.makeText(this, "图片设置失败,请重新选择图片~", Toast.LENGTH_SHORT).show();
}
}
/**
* 获得SD卡照片的路径
* @param uri
* @param selection
* @return
*/
private String getImagePath(Uri uri, String selection) {
String path = null;
Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
path = cursor.getString(cursor.getColumnIndex
(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
/**
* 安卓4.4之前的版本获取路径,为真实路径,不需解析直接用
* @param data
*/
private void handleImageBeforeKitKat(Intent data) {
Uri uri = data.getData();
String imagePath = getImagePath(uri, null);
displayImage(imagePath);
}
/**
* 安卓4.4之后的版本获取路劲,要对路径解析
* @param data
*/
@TargetApi(19)
private void handleImageOnKitkat(Intent data) {
Uri uri = data.getData();
String imagePath = null;
if(DocumentsContract.isDocumentUri(this,uri)){
//如果是Document类型的uri,则通过Document类型的id处理
String docId = DocumentsContract.getDocumentId(uri);
if("com.android.providers.media.documents".equals(uri.getAuthority())){
String id = docId.split(":")[1];
String selection = MediaStore.Images.Media._ID+"="+id;
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);
}else if("com.android.providers.111.documents".equals(uri.getAuthority())){
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads" +
"/public_downloads"),Long.valueOf(docId));
imagePath = getImagePath(contentUri,null);
}
}else if("content".equalsIgnoreCase(uri.getScheme())){
imagePath = getImagePath(uri,null);
}else if("file".equalsIgnoreCase(uri.getScheme())){
imagePath = uri.getPath();
}
displayImage(imagePath);
}
//这里路径我写错了依旧能打开,想了想“”里面的东西应该是没问题的,
}
总结:首先注意,声明权限,是必须的,
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
说是4.4之后不再需要声明权限也能进入,但是没有这个权限,在我6.0的安卓机上程序无法进入,所以应该是必不可少的。
其次,需要声明内容提供器
<provider
android:authorities="com.example.chenxuanhe.cameratest"
android:name="android.support.v4.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
由于android:authorities=”com.example.chenxuanhe.cameratest”的参数需要和代码中if (Build.VERSION.SDK_INT >= 24) {
imageUri = FileProvider.getUriForFile(MainActivity.this, “com.example.chenxuanhe.” +”cameratest”, outputImage);中的第二个参数要一致。
然后android:resource=”@xml/file_paths”/>这个资源文件需要自己在res里面创建一个xml文件,再在里面创建file_paths.xml文件,文件中代码为
<?xml version = "1.0" encoding = "utf-8"?>
<paths xmlns:android = "http://schemas.android.com/apk/res/android">
<external-path name="my_images" path=""/>
</paths>
这样才能完整完成整个操作。