Android开发秘籍学习笔记(十四)
2016-01-30 13:51
477 查看
做一个很简单的效果,点击一个按钮,打开一个AlertDialog,有两个选项一个是打开相册一个是打开相机,选择在相册中一个张图片然后设置到ImageView中去,同样拍照也同样,拍下一张照片设置到ImageView中。
布局文件很简单了,就设置一个按钮就可以,这里就不贴代码了。给这个按钮一个点击监听器,点击后可以打开AlertDialog,AlertDialog的学习可以借鉴这里Android详细的对话框AlertDialog.Builder使用方法,讲解的很详细,当然你也可以为了界面的美观自定义AlertDialog或者使用popupwindow都是可以的。
这里贴出按钮点击监听器的代码:
这里的choose_str是个全局变量,是个字符串数组,有两个字符串{“拍照”,“从相册中选择”},这样点击按钮后就可以显示出AlertDialog了。
接下来就是take_photo()函数和open_album()函数了,
take_photo()顾名思义就是要调用相机,我第一次上时找了调用摄像头的相关代码相当麻烦,之后才修正过来:
这里贴出我Logcat的内容,可以看到我图片的保存位置是在/storage/sdcard1/Pictures/XXXXX.jpg,再结合我上面的代码应该可以明白文件保存的方法。
open_album()则是打开图库,选择图片显示在ImageView即可。
这里只需要调用相册即可了,然后这里说明下这里应该是要使用startActivityForResult()这个函数的,因为之后得使用onActivityResult来处理将填充ImageView的内容
这里提及一下在Java程序中如何填充ImageView,我看了看官网的ImageView的各种函数,发现有3个方法可以设置ImageView里的图片内容,分别是
这里我们需要使用第二个函数---setImageBitmap(),也是在Java 程序中最常用的填充ImageView的方法了,take_photo()中我们已经保存了图片的路径---photo_path_str,使用:
而open_album()函数,打开图库后选择图片在onActivityResult()使用getData即可以获得一个路径的Uri,但这个Uri并不可以直接使用toString()转换为String 类型然后使用上面的方法,具体为什么我在后面在解释,先把如何将Uri转换为可以使用的Bitmap。
解释下为什么不能够理由Uri.toString,这里我输出了Uri.toString,输出的可以看到Uri格式是content://media/external/images/media/853610,关于Uri的简介可以看Uri的简介以及android图片文件的路径地址与Uri的相互转换 即差不多能理解为什么不能转换了
其实我上面输出的路径也可以看出一些端倪~
完整的代码:点击打开链接(我还做了个侧滑。。。)
布局文件很简单了,就设置一个按钮就可以,这里就不贴代码了。给这个按钮一个点击监听器,点击后可以打开AlertDialog,AlertDialog的学习可以借鉴这里Android详细的对话框AlertDialog.Builder使用方法,讲解的很详细,当然你也可以为了界面的美观自定义AlertDialog或者使用popupwindow都是可以的。
这里贴出按钮点击监听器的代码:
choose_photo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Dialog alertDialog = new AlertDialog.Builder(MainActivity.this) .setTitle("选择照片") .setIcon(R.drawable.icon) .setItems(choose_str, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case (0): Log.i(TAG, "I have clicked" + which); take_photo(); break; case (1): Log.i(TAG, "I have clicked" + which); open_album(); break; } } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).create(); alertDialog.show(); } });
这里的choose_str是个全局变量,是个字符串数组,有两个字符串{“拍照”,“从相册中选择”},这样点击按钮后就可以显示出AlertDialog了。
接下来就是take_photo()函数和open_album()函数了,
take_photo()顾名思义就是要调用相机,我第一次上时找了调用摄像头的相关代码相当麻烦,之后才修正过来:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);这便是调用相机,这里有个问题,如果我不设置
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outFile));好像图片不会自动保存到图库中,即你拍完照按✅后,你去图库找的话,是找不到你刚才拍下的那张照片的(我的是没有找的)。所以这里我们除了拍下照片后还需要保存下图片的路径(String类型的)为之后获取图片做准备。
public void take_photo(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File outdir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
Log.i(TAG, Environment.DIRECTORY_PICTURES);
if (!outdir.exists()) {
outdir.mkdirs();
}
File outFile = new File(outdir, System.currentTimeMillis() + ".jpg");
photo_path_str = outFile.getAbsolutePath();
Log.i(TAG,photo_path_str);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outFile));
}else{
Log.e(TAG, "请检查SD卡");
}
startActivityForResult(intent,TAKE_PHOTO_REQUEST_CODE);
Log.i(TAG, "Implement take_photo()");
}
这里贴出我Logcat的内容,可以看到我图片的保存位置是在/storage/sdcard1/Pictures/XXXXX.jpg,再结合我上面的代码应该可以明白文件保存的方法。
open_album()则是打开图库,选择图片显示在ImageView即可。
public void open_album(){ Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent,OPEN_ALBUM_REQUEST_CODE); Log.i(TAG, "Implement open_album"); }
这里只需要调用相册即可了,然后这里说明下这里应该是要使用startActivityForResult()这个函数的,因为之后得使用onActivityResult来处理将填充ImageView的内容
这里提及一下在Java程序中如何填充ImageView,我看了看官网的ImageView的各种函数,发现有3个方法可以设置ImageView里的图片内容,分别是
public void setImageDrawable (Drawable drawable)
public void setImageBitmap (Bitmap bm)
public void setImageResource (int resId)
这里我们需要使用第二个函数---setImageBitmap(),也是在Java 程序中最常用的填充ImageView的方法了,take_photo()中我们已经保存了图片的路径---photo_path_str,使用:bitmap = BitmapFactory.decodeFile(photo_path_str);即转换为了Bitmap类型,就可以填充进ImageView了。
而open_album()函数,打开图库后选择图片在onActivityResult()使用getData即可以获得一个路径的Uri,但这个Uri并不可以直接使用toString()转换为String 类型然后使用上面的方法,具体为什么我在后面在解释,先把如何将Uri转换为可以使用的Bitmap。
Uri uri = data.getData(); if (uri != null){ String srcPath = uri.getPath().toString(); Log.i(TAG, "srcPath:" + srcPath); try { bitmap = MediaStore.Images.Media.getBitmap(resolver,uri); }catch (Exception e){ e.printStackTrace(); Log.e(TAG, e.getMessage()); } imageView.setImageBitmap(bitmap); }else{ Log.e(TAG, "Uri不存在"); } Toast.makeText(MainActivity.this,TAG + "Success in opening album", Toast.LENGTH_LONG).show(); }else if (resultCode == RESULT_CANCELED){ Toast.makeText(MainActivity.this, TAG + "Canceled in opening album", Toast.LENGTH_LONG).show(); }else{ Log.e(TAG,"打开相册失败"); }这里要利用ContentResolver resolver = getContentResolver()将Uri转换为可以使用的Bitmap。
解释下为什么不能够理由Uri.toString,这里我输出了Uri.toString,输出的可以看到Uri格式是content://media/external/images/media/853610,关于Uri的简介可以看Uri的简介以及android图片文件的路径地址与Uri的相互转换 即差不多能理解为什么不能转换了
其实我上面输出的路径也可以看出一些端倪~
完整的代码:点击打开链接(我还做了个侧滑。。。)
相关文章推荐
- 关于Android应用如何正确存放文件
- Android判断用户是平板还是手机的方法
- Android分享笔记(1) 获取屏幕尺寸,包括状态栏
- Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动并跳转的效果(二)
- Android版本和API Level对应表
- Android消息机制源码分析
- android153 笔记 5
- 炫丽的朋友圈视频滚动播放功能
- volley的特点
- 表盘绘制
- Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动的效果(一)
- Android-MemoryFile介绍
- android *** Activity 02
- Android-各种Span的用法
- Android 关于“NetworkOnMainThreadException”
- Android-夜间模式最佳实践
- Android点击切换主题theme
- Android 时间控件2.钟表
- Android中自定义RatingBar(评分控件)的方法
- android录音 MediaRecorder类的使用简介