
废话不多说了,直接给大家贴代码了,具体代码如下所述:
/** * 1、实现原理:用户打开相册或相机选择相片后,相片经过压缩并设置在控件上,图片在本地sd卡存一份(如果有的话,没有则内部存储,所以还 * 需要判断用户是否挂载了sd卡),然后在服务器上存储一份该图片,当下次再次启动应用时,会默认去sd卡加载该图片,如果本地没有,再会去联网请求 * 2、使用了picasso框架以及自定义BitmapUtils工具类 * 3、记得加上相关权限 * <uses-permission androID:name="androID.permission.INTERNET"></uses-permission> <uses-permission androID:name="androID.permission.CAMERA"/> <uses-permission androID:name="androID.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> * */public class MainActivity extends AppCompatActivity implements VIEw.OnClickListener { private ImageVIEw iv;//要设置的头像 private button btn_photo;//调用相册按钮 private button btn_camera;//调用相机按钮 @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); iv=(ImageVIEw) findVIEwByID(R.ID.iv); btn_photo = (button) findVIEwByID(R.ID.btn_photo); btn_camera = (button) findVIEwByID(R.ID.btn_camera); btn_photo.setonClickListener(this); btn_camera.setonClickListener(this); } @OverrIDe public voID onClick(VIEw v) { switch (v.getID()) { case R.ID.btn_photo://打开系统相册 Intent intent=new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent,100); break; case R.ID.btn_camera://打开系统相机 Intent intent2=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent2,200); break; } } @RequiresAPI(API = Build.VERSION_CODES.KITKAT) @OverrIDe protected voID onActivityResult(int requestCode,int resultCode,Intent data) { super.onActivityResult(requestCode,resultCode,data); if(requestCode==100&&resultCode==RESulT_OK&&data!=null){//系统相册 Uri imageData = data.getData(); String path=getPath(imageData); Bitmap bitmap = BitmapFactory.decodefile(path); Bitmap bitmap1 = BitmapUtils.zoom(bitmap,iv.getWIDth(),iv.getHeight()); Bitmap bitmap2 = BitmapUtils.circleBitmap(bitmap1); //加载显示 iv.setimageBitmap(bitmap2); //bitmap图片上传到服务器...... //bitmap图片保存到本地 saveImage(bitmap2); }else if(requestCode==200&&resultCode==RESulT_OK&&data!=null){//系统相机 Bitmap bitmap = (Bitmap) data.getExtras().get("data"); BitmapUtils.zoom(bitmap,iv.getHeight()); bitmap=BitmapUtils.circleBitmap(bitmap); //加载显示 iv.setimageBitmap(bitmap); //bitmap图片上传到服务器...... //bitmap图片保存到本地 saveImage(bitmap); } } /** * 数据的存储。(5种) * Bimap:内存层面的图片对象。 * * 存储--->内存: * BitmapFactory.decodefile(String filePath); * BitmapFactory.decodeStream(inputStream is); * 内存--->存储: * bitmap.compress(Bitmap.CompressFormat.PNG,100,OutputStream os); */ private voID saveImage(Bitmap bitmap) { file filesDir; if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判断sd卡是否挂载 //路径1:storage/sdcard/AndroID/data/包名/files filesDir = this.getExternalfilesDir(""); }else{//手机内部存储 //路径:data/data/包名/files filesDir = this.getfilesDir(); } fileOutputStream fos = null; try { file file = new file(filesDir,"icon.png"); fos = new fileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG,fos); } catch (fileNotFoundException e) { e.printstacktrace(); }finally{ if(fos != null){ try { fos.close(); } catch (IOException e) { e.printstacktrace(); } } } } //如果本地有,就不需要再去联网去请求 private boolean readImage() { file filesDir; if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判断sd卡是否挂载 //路径1:storage/sdcard/AndroID/data/包名/files filesDir = getExternalfilesDir(""); }else{//手机内部存储 //路径:data/data/包名/files filesDir = getfilesDir(); } file file = new file(filesDir,"icon.png"); if(file.exists()){ //存储--->内存 Bitmap bitmap = BitmapFactory.decodefile(file.getabsolutePath()); iv.setimageBitmap(bitmap); return true; } return false; } @RequiresAPI(API = Build.VERSION_CODES.KITKAT) private String getPath(Uri uri) { int sdkVersion = Build.VERSION.SDK_INT; //高于4.4.2的版本 if (sdkVersion >= 19) { Log.e("TAG","uri auth: " + uri.getAuthority()); if (isExternalStoragedocument(uri)) { String docID = documentsContract.getdocumentID(uri); String[] split = docID.split(":"); String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } } else if (isDownloadsdocument(uri)) { final String ID = documentsContract.getdocumentID(uri); final Uri contentUri = ContentUris.withAppendedID(Uri.parse("content://downloads/public_downloads"),Long.valueOf(ID)); return getDataColumn(this,contentUri,null,null); } else if (isMediadocument(uri)) { final String docID = documentsContract.getdocumentID(uri); final String[] split = docID.split(":"); final String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("vIDeo".equals(type)) { contentUri = MediaStore.VIDeo.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_ID=?"; final String[] selectionArgs = new String[]{split[1]}; return getDataColumn(this,selection,selectionArgs); } else if (isMedia(uri)) { String[] proj = {MediaStore.Images.Media.DATA}; Cursor actualimagecursor = this.managedquery(uri,proj,null); int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); actualimagecursor.movetoFirst(); return actualimagecursor.getString(actual_image_column_index); } } else if ("content".equalsIgnoreCase(uri.getScheme())) { // Return the remote address if (isGooglePhotosUri(uri)) return uri.getLastPathSegment(); return getDataColumn(this,uri,null); } // file else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } /** * uri路径查询字段 * * @param context * @param uri * @param selection * @param selectionArgs * @return */ public static String getDataColumn(Context context,Uri uri,String selection,String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = {column}; try { cursor = context.getContentResolver().query(uri,projection,selectionArgs,null); if (cursor != null && cursor.movetoFirst()) { final int index = cursor.getColumnIndexOrThrow(column); return cursor.getString(index); } } finally { if (cursor != null) cursor.close(); } return null; } private boolean isExternalStoragedocument(Uri uri) { return "com.androID.externalstorage.documents".equals(uri.getAuthority()); } public static boolean isDownloadsdocument(Uri uri) { return "com.androID.provIDers.downloads.documents".equals(uri.getAuthority()); } public static boolean isMediadocument(Uri uri) { return "com.androID.provIDers.media.documents".equals(uri.getAuthority()); } public static boolean isMedia(Uri uri) { return "media".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is Google Photos. */ public static boolean isGooglePhotosUri(Uri uri) { return "com.Google.androID.apps.photos.content".equals(uri.getAuthority()); } /** * 判断本地是否有该图片,没有则去联网请求 * */ @OverrIDe protected voID onResume() { super.onResume(); if(readImage()){ return; } }}//BitmapUtils工具类public class BitmapUtils { /** * 该方法用于将图片进行圆形处理 * */ public static Bitmap circleBitmap(Bitmap source){ //默认只对宽进行处理 int wIDth=source.getWIDth(); Bitmap bitmap=Bitmap.createBitmap(wIDth,wIDth,Bitmap.Config.ARGB_8888); Canvas canvas=new Canvas(bitmap); Paint paint=new Paint(); //设置抗锯齿 paint.setAntiAlias(true); canvas.drawCircle(wIDth/2,wIDth/2,paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(source,paint); return bitmap; } /** * 该方法用于图片压缩处理,注意wIDth、height参数的类型必须是float * */ public static Bitmap zoom(Bitmap source,float wIDth,float height){ Matrix matrix=new Matrix(); //图片进行压缩处理 matrix.postscale(wIDth/source.getWIDth(),height/source.getHeight()); Bitmap bitmap = Bitmap.createBitmap(source,source.getWIDth(),source.getHeight(),matrix,false); return bitmap; }}以上所述是小编给大家介绍的AndroID实现调用系统图库与相机设置头像并保存在本地及服务器 ,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
总结以上是内存溢出为你收集整理的Android实现调用系统图库与相机设置头像并保存在本地及服务器全部内容,希望文章能够帮你解决Android实现调用系统图库与相机设置头像并保存在本地及服务器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)