編輯:關於Android編程
最近在項目中用到了照相和相冊取圖剪裁上傳頭像,就在網上逛了逛,基本都是千篇一律,就弄下來用了用,沒想到的是各種各樣的奇葩問題就出現了。先給大家看看代碼問題慢慢來解決
這是調用相機
public static File getImageFromCamer(Context context, File cameraFile, int REQUE_CODE_CAMERA, Intent intent) { intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File fileDir = HelpUtil.getFile(context, "/Tour/user_photos"); cameraFile = new File(fileDir.getAbsoluteFile() + "/" + System.currentTimeMillis() + ".jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile)); ((Activity) context).startActivityForResult(intent, REQUE_CODE_CAMERA); return cameraFile; }在這裡我返回了一個file對象,這是應為項目中需要,大家可以不必真寫,直接傳一個Uri對象過來就好了
下面是調用相冊
public static void getImageFromPhoto(Context context, int REQUE_CODE_PHOTO) { Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); ((Activity) context).startActivityForResult(intent, REQUE_CODE_PHOTO); }當然接下來是調用Activity的OnActivityResult了
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { switch (requestCode) { case ConstantUtil.REQUE_CODE_CAMERA: uri = Uri.fromFile(cameraFile); PhotoUtil.startPhotoZoom(context, uri, ConstantUtil.REQUE_CODE_CROP); break; case ConstantUtil.REQUE_CODE_PHOTO: if (null != data) {//為了取消選取不報空指針用的 uri = data.getData(); PhotoUtil.startPhotoZoom(context, uri, ConstantUtil.REQUE_CODE_CROP); } break; case ConstantUtil.REQUE_CODE_CROP: if(uri==null){ break; } cropBitmap=HelpUtil.getBitmapFromUri(uri,context); if (cropBitmap != null) { iv_headphoto.setImageBitmap(cropBitmap); baos = new ByteArrayOutputStream(); cropBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); headPicString = new String(Base64.encode( baos.toByteArray(), 0)); UploadPic(headPicString); } break; default: break; } }當然還有大家關心的剪切
public static void startPhotoZoom(Context context, Uri uri, int REQUE_CODE_CROP) { int dp = 500; Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 下面這個crop=true是設置在開啟的Intent中設置顯示的VIEW可裁剪 intent.putExtra("crop", "true"); intent.putExtra("scale", true);// 去黑邊 intent.putExtra("scaleUpIfNeeded", true);// 去黑邊 // aspectX aspectY 是寬高的比例 intent.putExtra("aspectX", 1);//輸出是X方向的比例 intent.putExtra("aspectY", 1); // outputX outputY 是裁剪圖片寬高,切忌不要再改動下列數字,會卡死 intent.putExtra("outputX", dp);//輸出X方向的像素 intent.putExtra("outputY", dp); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection", true); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); intent.putExtra("return-data", false);//設置為不返回數據 ((Activity) context).startActivityForResult(intent, REQUE_CODE_CROP); }
在很多博客中都把“return-data”設置為了true然後在onActivityResult中通過data.getParcelableExtra("data")來獲取數據,不過這樣的話dp這個變量的值就不能太大了,不然你的程序就掛了。這裡也就是我遇到問題的地方了,在大多數高配手機上這樣用是沒有問題的,不過很多低配手機就有點hold不住了,直接就異常了,包括我們的國產神機米3也沒能hold住,所以我建議大家不要通過return data 大數據,小數據還是沒有問題的,說以我們在剪切圖片的時候就盡量使用Uri這個東東來幫助我們。
下面是我們進行剪裁用到的一些參數
Exta Options Table for image/* crop:
SetExtra DataType Description crop String Signals the crop feature aspectX int Aspect Ratio aspectY int Aspect Ratio outputX int width of output created from this Intent outputY int width of output created from this Intent scale boolean should it scale return-data boolean Return the bitmap with Action=inline-data by using the data data Parcelable Bitmap to process, you may provide it a bitmap (not tested) circleCrop String if this string is not null, it will provide some circular cr MediaStore.EXTRA_OUTPUT ("output") URI Set this URi to a File:///, see example code
最後把通過Uri獲得bitmap的方法給大家貼上
public static Bitmap getBitmapFromUri(Uri uri,Context mContext) { try { // 讀取uri所在的圖片 Bitmap bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), uri); return bitmap; } catch (Exception e) { e.printStackTrace(); return null; } }
ListView是我們在開發Android程序時用得比較多的一種widget,通常用來展示多條數據,這裡,我對ListView的一些功能點作一個簡單介紹。 1. Ca
今天因為工作需要,把以前編寫的一個GPS測試程序拿出來重新修改了一下。這個程序說起來有些歷史了,是我11年編寫的,那時候學了Android開發沒多久,算是一個實驗性的作品
上一篇學習了基本用法,今天學一下稍微復雜一點的,先看一下效果圖 為了完成上面的效果還是要用到上一期開頭的四步
在前面,我介紹了使用 Volley 傳輸網絡數據。戳這裡Volley是一個很好用的網絡框架,但是Volley 不適合用來下載大的數據文件。因為 Volley 會保持在解析