Android初级开发(八)——手机多媒体—弹窗选择照片或直接拍照的实现
来源:互联网 发布:淘宝网店货源一件代发 编辑:程序博客网 时间:2024/05/15 09:11
一、效果图
实现的功能主要是主页一个Button,点击后弹出选择框,选择拍照还是从相册选取照片,不管哪种方式,最后将照片返回到主页面上显示出来。
二、实现
1、activity_main.xml布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <LinearLayout android:id="@+id/btn_layout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="Choose picture" /> </LinearLayout> <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/btn_layout" /></RelativeLayout>
2、创建一个图片的工具类,我这里用的是别人封装好的,如果以后对图片进行操作,可以直接调用
ImageTools.java
/** * Tools for handler picture * * */public final class ImageTools { /** * Transfer drawable to bitmap * * @param drawable * @return */ public static Bitmap drawableToBitmap(Drawable drawable) { int w = drawable.getIntrinsicWidth(); int h = drawable.getIntrinsicHeight(); Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; Bitmap bitmap = Bitmap.createBitmap(w, h, config); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, w, h); drawable.draw(canvas); return bitmap; } /** * Bitmap to drawable * * @param bitmap * @return */ public static Drawable bitmapToDrawable(Bitmap bitmap) { return new BitmapDrawable(bitmap); } /** * Input stream to bitmap * * @param inputStream * @return * @throws Exception */ public static Bitmap inputStreamToBitmap(InputStream inputStream) throws Exception { return BitmapFactory.decodeStream(inputStream); } /** * Byte transfer to bitmap * * @param byteArray * @return */ public static Bitmap byteToBitmap(byte[] byteArray) { if (byteArray.length != 0) { return BitmapFactory .decodeByteArray(byteArray, 0, byteArray.length); } else { return null; } } /** * Byte transfer to drawable * * @param byteArray * @return */ public static Drawable byteToDrawable(byte[] byteArray) { ByteArrayInputStream ins = null; if (byteArray != null) { ins = new ByteArrayInputStream(byteArray); } return Drawable.createFromStream(ins, null); } /** * Bitmap transfer to bytes * * @return */ public static byte[] bitmapToBytes(Bitmap bm) { byte[] bytes = null; if (bm != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); bytes = baos.toByteArray(); } return bytes; } /** * Drawable transfer to bytes * * @param drawable * @return */ public static byte[] drawableToBytes(Drawable drawable) { BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; Bitmap bitmap = bitmapDrawable.getBitmap(); byte[] bytes = bitmapToBytes(bitmap); ; return bytes; } /** * Base64 to byte[]// */// public static byte[] base64ToBytes(String base64) throws IOException {// byte[] bytes = Base64.decode(base64);// return bytes;// }//// /**// * Byte[] to base64// */// public static String bytesTobase64(byte[] bytes) {// String base64 = Base64.encode(bytes);// return base64;// } /** * Create reflection images * * @param bitmap * @return */ public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) { final int reflectionGap = 4; int w = bitmap.getWidth(); int h = bitmap.getHeight(); Matrix matrix = new Matrix(); matrix.preScale(1, -1); Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, h / 2, w, h / 2, matrix, false); Bitmap bitmapWithReflection = Bitmap.createBitmap(w, (h + h / 2), Config.ARGB_8888); Canvas canvas = new Canvas(bitmapWithReflection); canvas.drawBitmap(bitmap, 0, 0, null); Paint deafalutPaint = new Paint(); canvas.drawRect(0, h, w, h + reflectionGap, deafalutPaint); canvas.drawBitmap(reflectionImage, 0, h + reflectionGap, null); Paint paint = new Paint(); LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP); paint.setShader(shader); // Set the Transfer mode to be porter duff and destination in paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); // Draw a rectangle using the paint with our linear gradient canvas.drawRect(0, h, w, bitmapWithReflection.getHeight() + reflectionGap, paint); return bitmapWithReflection; } /** * Get rounded corner images * * @param bitmap * @param roundPx * 5 10 * @return */ public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, w, h); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } /** * 缩小图片 * * @param bitmap * @param width * @param height * @return */ public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); Matrix matrix = new Matrix(); float scaleWidth = ((float) width / w); float scaleHeight = ((float) height / h); matrix.postScale(scaleWidth, scaleHeight); Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); return newbmp; } /** * Resize the drawable * @param drawable * @param w * @param h * @return */ public static Drawable zoomDrawable(Drawable drawable, int w, int h) { int width = drawable.getIntrinsicWidth(); int height = drawable.getIntrinsicHeight(); Bitmap oldbmp = drawableToBitmap(drawable); Matrix matrix = new Matrix(); float sx = ((float) w / width); float sy = ((float) h / height); matrix.postScale(sx, sy); Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height, matrix, true); return new BitmapDrawable(newbmp); } /** * Get images from SD card by path and the name of image * @param photoName * @return */ public static Bitmap getPhotoFromSDCard(String path,String photoName){ Bitmap photoBitmap = BitmapFactory.decodeFile(path + "/" +photoName +".png"); if (photoBitmap == null) { return null; }else { return photoBitmap; } } /** * Check the SD card * @return */ public static boolean checkSDCardAvailable(){ return android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); } /** * Get image from SD card by path and the name of image * @return */ public static boolean findPhotoFromSDCard(String path,String photoName){ boolean flag = false; if (checkSDCardAvailable()) { File dir = new File(path); if (dir.exists()) { File folders = new File(path); File photoFile[] = folders.listFiles(); for (int i = 0; i < photoFile.length; i++) { String fileName = photoFile[i].getName().split("\\.")[0]; if (fileName.equals(photoName)) { flag = true; } } }else { flag = false; }// File file = new File(path + "/" + photoName + ".jpg" );// if (file.exists()) {// flag = true;// }else {// flag = false;// } }else { flag = false; } return flag; } /** * 将图片保存到本地SD卡 * @param photoBitmap * @param photoName * @param path */ public static void savePhotoToSDCard(Bitmap photoBitmap,String path,String photoName){ if (checkSDCardAvailable()) { File dir = new File(path); if (!dir.exists()){ dir.mkdirs(); } File photoFile = new File(path , photoName + ".png"); FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(photoFile); if (photoBitmap != null) { if (photoBitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream)) { fileOutputStream.flush();// fileOutputStream.close(); } } } catch (FileNotFoundException e) { photoFile.delete(); e.printStackTrace(); } catch (IOException e) { photoFile.delete(); e.printStackTrace(); } finally{ try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * Delete the image from SD card * @param path * file:///sdcard/temp.jpg */ public static void deleteAllPhoto(String path){ if (checkSDCardAvailable()) { File folder = new File(path); File[] files = folder.listFiles(); for (int i = 0; i < files.length; i++) { files[i].delete(); } } } //删除上一次截图的临时文件,包括图片路径和文件名称 public static void deletePhotoAtPathAndName(String path,String fileName){ if (checkSDCardAvailable()) { File folder = new File(path); File[] files = folder.listFiles(); for (int i = 0; i < files.length; i++) { System.out.println(files[i].getName()); if (files[i].getName().equals(fileName)) { files[i].delete(); } } } }}
3、MainActivity.java
public class MainActivity extends Activity { private static final int TAKE_PICTURE = 0; //拍照 private static final int CHOOSE_PICTURE = 1; //从相册中选择照片 private static final int CROP = 2; private static final int CROP_PICTURE = 3; private static final int SCALE = 5;//照片缩小比例 private ImageView iv_image = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv_image = (ImageView) this.findViewById(R.id.img); this.findViewById(R.id.btn).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //弹出对话框,选择要直接拍照还是从相册中选择照片 showPicturePicker(MainActivity.this,false); } }); } //弹出Dialog选择窗口 public void showPicturePicker(Context context,boolean isCrop){ final boolean crop = isCrop; AlertDialog.Builder builder = new AlertDialog.Builder(context); //设置弹出框标题 builder.setTitle("图片来源"); builder.setNegativeButton("取消", null); builder.setItems(new String[]{"拍照","相册"}, new DialogInterface.OnClickListener() { //类型码 int REQUEST_CODE; @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case TAKE_PICTURE: Uri imageUri = null; String fileName = null; //发送启动相机程序请求 Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (crop) { REQUEST_CODE = CROP; //删除上一次截图的临时文件 SharedPreferences sharedPreferences = getSharedPreferences("temp",Context.MODE_WORLD_WRITEABLE); ImageTools.deletePhotoAtPathAndName(Environment.getExternalStorageDirectory().getAbsolutePath(), sharedPreferences.getString("tempName", "")); //保存本次截图临时文件名字 fileName = String.valueOf(System.currentTimeMillis()) + ".jpg"; Editor editor = sharedPreferences.edit(); editor.putString("tempName", fileName); editor.commit(); }else { REQUEST_CODE = TAKE_PICTURE; fileName = "image.jpg"; } //从文件中创建URI imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),fileName)); //指定照片保存路径(SD卡),image.jpg为一个临时文件,每次拍照后这个图片都会被替换 openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //开启一个带有返回值的Activity,请求吗为REQUEST_CODE startActivityForResult(openCameraIntent, REQUEST_CODE); break; case CHOOSE_PICTURE: //发送打开相册程序器请求 Intent openAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT); if (crop) { REQUEST_CODE = CROP; }else { REQUEST_CODE = CHOOSE_PICTURE; } openAlbumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(openAlbumIntent, REQUEST_CODE); break; default: break; } } }); builder.create().show(); } //截取图片 public void cropImage(Uri uri, int outputX, int outputY, int requestCode){ Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", outputX); intent.putExtra("outputY", outputY); intent.putExtra("outputFormat", "JPEG"); intent.putExtra("noFaceDetection", true); intent.putExtra("return-data", true); startActivityForResult(intent, requestCode); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case TAKE_PICTURE: //将保存在本地的图片取出并缩小后显示在界面上 Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/image.jpg"); Bitmap newBitmap = ImageTools.zoomBitmap(bitmap, bitmap.getWidth() / SCALE, bitmap.getHeight() / SCALE); //由于Bitmap内存占用较大,这里需要回收内存,否则会报out of memory异常 bitmap.recycle(); //将处理过的图片显示在界面上,并保存到本地 iv_image.setImageBitmap(newBitmap); ImageTools.savePhotoToSDCard(newBitmap, Environment.getExternalStorageDirectory().getAbsolutePath(), String.valueOf(System.currentTimeMillis())); break; case CHOOSE_PICTURE: ContentResolver resolver = getContentResolver(); //照片的原始资源地址 Uri originalUri = data.getData(); try { //使用ContentProvider通过URI获取原始图片 Bitmap photo = MediaStore.Images.Media.getBitmap(resolver, originalUri); if (photo != null) { //为防止原始图片过大导致内存溢出,这里先缩小原图显示,然后释放原始Bitmap占用的内存 Bitmap smallBitmap = ImageTools.zoomBitmap(photo, photo.getWidth() / SCALE, photo.getHeight() / SCALE); //释放原始图片占用的内存,防止out of memory异常发生 photo.recycle(); iv_image.setImageBitmap(smallBitmap); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } break; case CROP: Uri uri = null; if (data != null) { uri = data.getData(); System.out.println("Data"); }else { System.out.println("File"); String fileName = getSharedPreferences("temp",Context.MODE_WORLD_WRITEABLE).getString("tempName", ""); uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),fileName)); } cropImage(uri, 500, 500, CROP_PICTURE); break; case CROP_PICTURE: Bitmap photo = null; Uri photoUri = data.getData(); if (photoUri != null) { photo = BitmapFactory.decodeFile(photoUri.getPath()); } if (photo == null) { Bundle extra = data.getExtras(); if (extra != null) { photo = (Bitmap)extra.get("data"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); photo.compress(Bitmap.CompressFormat.JPEG, 100, stream); } } iv_image.setImageBitmap(photo); break; default: break; } } }}
4、修改AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ryantang.picture" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.ryantang.picture.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
上面的代码是借鉴别人的,我之前没考虑到用Dialog。之前做的是仿微信的底部弹窗,用的是popupwindow,遇到的问题是我们创建了一个popupwindow活动,在活动中监听按钮进入图片或者相机,这样最后得到的图片返回到popupwindow,并没有传到MainActivity。我尝试过将图片bitmap传到MainActivity,或者图片URI传过去,也尝试用startActivityForResult传值,都没有成功,,,问题可能还是对于三个问题理解不深入:1、对于文件存储和读取的理解;2、对于一个Activity传值给另一个Activity,或者说一个Activity控制另一个Activity的UI更新;3、对与startActivityForResult和onActivityResult的理解。。。。继续努力吧!!!
阅读全文
0 0
- Android初级开发(八)——手机多媒体—弹窗选择照片或直接拍照的实现
- Android初级开发(八)——手机多媒体—底部弹窗+选择照片或拍照的实现
- Android初级开发(八)——手机多媒体—音频和视频的使用
- Android初级开发(八)——手机多媒体—通知的使用
- Android 从相册选择照片 手机拍照
- Android开发——相册拍照_02.将拍照得到或相册中选择的图片显示在ImageView中
- Android多媒体—拍照Camera
- Android实现照片选择显示-从相册选择或拍照选择
- Android开发--拍照选择照片裁剪
- 选择手机中的一张照片或拍照上传图片(超高清晰度)
- 拍照、选择照片功能的实现
- Android实现拍照或从相册中选择照片并截取
- Android 相册选择照片或拍照获取图片系统6.0及7.0实现
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片
- Android调用手机拍照以及从相册选择照片,剪裁
- Android调用手机拍照以及从相册选择照片
- Pthreads并行编程之spin lock与mutex性能对比分析
- js弹出层
- 《TimesTen内存计算架构与实践》一书出版
- 弹出框确定之后刷新页面的问题
- Ubuntu中安装caffe 可视化工具之——Python h5py
- Android初级开发(八)——手机多媒体—弹窗选择照片或直接拍照的实现
- 初始Titan
- SPRING 定时
- Android 一键清理、内存清理功能实现
- Windows VMware 与 Hyper-V 兼容 共存
- Android通过AudioRecord录制系统内置声音
- 利用 ApsaraDB For SQL Server各版本高效而低廉地实现关键业务需求
- 4847. 【NOIP2016提高A组集训第5场11.2】夕阳
- yii2源码(2)--路由