在课程学习过程中,遇到了如下需求:
运行“新建联系人”程序,点击新建联系人按钮,打开输入信息界面并输入姓名、公司、电话号码、电子邮件并点击头像进入系统图库选择一张图片。
自己用的是API8.0的模拟器。
首先如何实现点击进入系统图库选择照片:
为按钮添加点击事件:
//点击修改头像
Button btn1=(Button) findViewById(R.id.button_changeHead);
assert btn1 != null;
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent i=new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
);
startActivityForResult(i, RESULT_LOAD_IMAGE);
}
});
由上述代码可以看出,使用了Activity数据回传的方式,startActivityForResult()。所以在该Activity中,重载函数
onActivityResult(int requestCode, int resultCode, Intent data)如下:
private static int RESULT_LOAD_IMAGE = 1;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
Log.i("pathdir", picturePath);
File file=new File(picturePath);
if(file.exists()){
Bitmap bm= BitmapFactory.decodeFile(picturePath);
imageView = (ImageView) findViewById(R.id.imageView_head);
imageView.setImageBitmap(bm);
}
}
}
上述代码已经能点击按钮,从系统图库中选择图片,但是选择图片后,imageView中显示的是空白,所以没有读出图片,但是通过Log.i(picpath)已经获取了图片的路径。
问题解决方法:
实验课询问了老师这个问题,老师告诉我是读取权限的问题,于是自己查找资料,找到了如下的解决方法:
第一步:在AndroidManifest.xml添加外部设备读取权限设置:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
网上查找资料说,设置了本权限后,应该就可以读取了,但是好像在4.0还是6.0以后强制取得动态权限才可以,于是在该Activity中编写权限动态获取的方法:
private static final int REQUEST_EXTERNAL_STORAGE=1;
private static String[] PERMISSIONS_STORAGE = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE" };
public static void checkStoragePermissions(Activity activity){
try{
//监测是否有写的权限
int permission= ActivityCompat.checkSelfPermission(activity,
"android.permission.WRITE_EXTERNAL_STORAGE");
int permission1= ActivityCompat.checkSelfPermission(activity,
"android.permission.READ_EXTERNAL_STORAGE");
if(permission != PackageManager.PERMISSION_GRANTED){
//没有写的权限,去申请写的权限,或弹出对话框
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
}
if(permission1 != PackageManager.PERMISSION_GRANTED){
//没有写的权限,去申请写的权限,或弹出对话框
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
}
}catch (Exception e){
e.printStackTrace();
}
}
并在OnCreat()方法中调用checkStoragePermission方法:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ctivity_addnewpeo);
checkStoragePermissions(this);
......
}
再次运行程序即可.效果如下: