标签:android des blog class code java
在android开发中, 在一些编辑个人信息的时候,经常会有头像这么一个东西,就两个方面,调用系统相机拍照,调用系统图库获取图片.但是往往会遇到各种问题:
1.oom
2.图片方向不对
3.activity result 的时候data == null
4.调用图库的时候没找到软件
嘿嘿..开代码:
首先是调用系统拍照,和图库的代码
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | packagecom.chzh.fitter.util;importjava.io.File;importandroid.app.Activity;importandroid.content.Context;importandroid.content.Intent;importandroid.database.Cursor;importandroid.net.Uri;importandroid.provider.MediaStore;importandroid.widget.Toast;//在onActivityResult方法中根据requestCode和resultCode来获取当前拍照的图片地址。//注意:这里有个问题,在有些机型当中(如SamsungI939、note2等)遇见了当拍照并存储之后,intent当中得到的data为空:/** * data = null 的情况主要是由于拍照的时候横屏了,导致重新create, 普通的解决方法可以在sharedpreference里面保存拍照文件的路径(onSaveInstance保存), * 在onRestoreSaveInstance里面在获取出来. * 最简单的可以用fileUtil 里面的一个静态变量保存起来.. * */publicclassCameraUtil {    privatestaticfinalString IMAGE_TYPE = "image/*";    privateContext mContext;    publicCameraUtil(Context context) {        mContext = context;    }    /**     * 打开照相机     * @param activity 当前的activity     * @param requestCode 拍照成功时activity forResult 的时候的requestCode     * @param photoFile 拍照完毕时,图片保存的位置     */    publicvoidopenCamera(Activity activity, intrequestCode, File photoFile) {        Intent intent = newIntent(MediaStore.ACTION_IMAGE_CAPTURE);        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));        activity.startActivityForResult(intent, requestCode);    }    /**     * 本地照片调用     * @param activity     * @param requestCode     */    publicvoidopenPhotos(Activity activity, intrequestCode) {        if(openPhotosNormal(activity, requestCode) && openPhotosBrowser(activity, requestCode) && openPhotosFinally());    }    /**     * PopupMenu打开本地相册.     */    privatebooleanopenPhotosNormal(Activity activity, intactResultCode) {        Intent intent = newIntent(Intent.ACTION_PICK, null);        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,                IMAGE_TYPE);        try{            activity.startActivityForResult(intent, actResultCode);        } catch(android.content.ActivityNotFoundException e) {            returntrue;        }        returnfalse;    }    /**     * 打开其他的一文件浏览器,如果没有本地相册的话     */    privatebooleanopenPhotosBrowser(Activity activity, intrequestCode) {        Toast.makeText(mContext, "没有相册软件,运行文件浏览器", Toast.LENGTH_LONG).show();        Intent intent = newIntent(Intent.ACTION_GET_CONTENT); // "android.intent.action.GET_CONTENT"        intent.setType(IMAGE_TYPE); // 查看类型 String IMAGE_UNSPECIFIED =                                    // "image/*";        Intent wrapperIntent = Intent.createChooser(intent, null);        try{            activity.startActivityForResult(wrapperIntent, requestCode);        } catch(android.content.ActivityNotFoundException e1) {            returntrue;        }        returnfalse;    }    /**     * 这个是找不到相关的图片浏览器,或者相册     */    privatebooleanopenPhotosFinally() {        Toast.makeText(mContext, "您的系统没有文件浏览器或则相册支持,请安装!", Toast.LENGTH_LONG).show();        returnfalse;    }    /**     * 获取从本地图库返回来的时候的URI解析出来的文件路径     * @return     */    publicstaticString getPhotoPathByLocalUri(Context context, Intent data) {        Uri selectedImage = data.getData();        String[] filePathColumn = { MediaStore.Images.Media.DATA };        Cursor cursor = context.getContentResolver().query(selectedImage,                filePathColumn, null, null, null);        cursor.moveToFirst();        intcolumnIndex = cursor.getColumnIndex(filePathColumn[0]);        String picturePath = cursor.getString(columnIndex);        cursor.close();        returnpicturePath;    }} | 
接下来是解决oom的
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 | packagecom.chzh.fitter.util;importjava.io.FileDescriptor;importjava.io.FileInputStream;importjava.io.IOException;importandroid.graphics.Bitmap;importandroid.graphics.Bitmap.Config;importandroid.graphics.BitmapFactory;importandroid.graphics.BitmapFactory.Options;importandroid.graphics.Canvas;importandroid.graphics.Matrix;importandroid.graphics.Paint;importandroid.graphics.PorterDuff.Mode;importandroid.graphics.PorterDuffXfermode;importandroid.graphics.Rect;importandroid.graphics.RectF;importandroid.media.ExifInterface;importandroid.net.Uri;importandroid.util.Log;importandroid.widget.ImageView;importcom.androidquery.util.AQUtility;/** * @author jarrahwu * */publicclassImageUtil {    /**     * Utility method for downsampling images.     *     * @param path     *            the file path     * @param data     *            if file path is null, provide the image data directly     * @param target     *            the target dimension     * @param isWidth     *            use width as target, otherwise use the higher value of height     *            or width     * @param round     *            corner radius     * @return the resized image     */    publicstaticBitmap getResizedImage(String path, byte[] data, inttarget,            booleanisWidth, intround) {        Options options = null;        if(target > 0) {            Options info = newOptions();            info.inJustDecodeBounds = true;            //设置这两个属性可以减少内存损耗            info.inInputShareable = true;            info.inPurgeable = true;            decode(path, data, info);            intdim = info.outWidth;            if(!isWidth)                dim = Math.max(dim, info.outHeight);            intssize = sampleSize(dim, target);            options = newOptions();            options.inSampleSize = ssize;        }        Bitmap bm = null;        try{            bm = decode(path, data, options);        } catch(OutOfMemoryError e) {            L.red(e.toString());            e.printStackTrace();        }        if(round > 0) {            bm = getRoundedCornerBitmap(bm, round);        }        returnbm;    }    privatestaticBitmap decode(String path, byte[] data,            BitmapFactory.Options options) {        Bitmap result = null;        if(path != null) {            result = decodeFile(path, options);        } elseif(data != null) {            // AQUtility.debug("decoding byte[]");            result = BitmapFactory.decodeByteArray(data, 0, data.length,                    options);        }        if(result == null&& options != null&& !options.inJustDecodeBounds) {            AQUtility.debug("decode image failed", path);        }        returnresult;    }    privatestaticBitmap decodeFile(String path, BitmapFactory.Options options) {        Bitmap result = null;        if(options == null) {            options = newOptions();        }        options.inInputShareable = true;        options.inPurgeable = true;        FileInputStream fis = null;        try{            fis = newFileInputStream(path);            FileDescriptor fd = fis.getFD();            // AQUtility.debug("decoding file");            // AQUtility.time("decode file");            result = BitmapFactory.decodeFileDescriptor(fd, null, options);            // AQUtility.timeEnd("decode file", 0);        } catch(IOException e) {            AQUtility.report(e);        } finally{            AQUtility.close(fis);        }        returnresult;    }    privatestaticintsampleSize(intwidth, inttarget) {        intresult = 1;        for(inti = 0; i < 10; i++) {            if(width < target * 2) {                break;            }            width = width / 2;            result = result * 2;        }        returnresult;    }    /**     * 获取圆角的bitmap     * @param bitmap     * @param pixels     * @return     */    privatestaticBitmap getRoundedCornerBitmap(Bitmap bitmap, intpixels) {        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),                bitmap.getHeight(), Config.ARGB_8888);        Canvas canvas = newCanvas(output);        finalintcolor = 0xff424242;        finalPaint paint = newPaint();        finalRect rect = newRect(0, 0, bitmap.getWidth(), bitmap.getHeight());        finalRectF rectF = newRectF(rect);        finalfloatroundPx = pixels;        paint.setAntiAlias(true);        canvas.drawARGB(0, 0, 0, 0);        paint.setColor(color);        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);        paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));        canvas.drawBitmap(bitmap, rect, rect, paint);        returnoutput;    }    /**     * auto fix the imageOrientation     * @param bm source     * @param iv imageView  if set invloke it‘s setImageBitmap() otherwise do nothing     * @param uri image Uri if null user path     * @param path image path if null use uri     */    publicstaticBitmap autoFixOrientation(Bitmap bm, ImageView iv, Uri uri,String path) {        intdeg = 0;        try{            ExifInterface exif = null;            if(uri == null) {                exif = newExifInterface(path);            }            elseif(path == null) {                exif = newExifInterface(uri.getPath());            }            if(exif == null) {                L.red("exif is null check your uri or path");                returnbm;            }            String rotate = exif.getAttribute(ExifInterface.TAG_ORIENTATION);            introtateValue = Integer.parseInt(rotate);            System.out.println("orientetion : "+ rotateValue);            switch(rotateValue) {            caseExifInterface.ORIENTATION_ROTATE_90:                deg = 90;                break;            caseExifInterface.ORIENTATION_ROTATE_180:                deg = 180;                break;            caseExifInterface.ORIENTATION_ROTATE_270:                deg = 270;                break;            default:                deg = 0;                break;            }        } catch(Exception ee) {            Log.d("catch img error", "return");            if(iv != null)            iv.setImageBitmap(bm);            returnbm;        }        Matrix m = newMatrix();        m.preRotate(deg);        bm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true);        //bm = Compress(bm, 75);        if(iv != null)            iv.setImageBitmap(bm);        returnbm;    }} | 
这两个东西,是解决这些问题的利器.
如果想要代码Demo的话,可以留言.有什么坑爹的地方,多多拍砖..over.
一站式解决,Android 拍照 图库的各种问题.,布布扣,bubuko.com
标签:android des blog class code java
原文地址:http://www.cnblogs.com/jarrah/p/3726079.html