
因为项目中需要用到头像上传的功能,所以就下个Ddmo先来实现下。
demo我是类似仿微信的,在一个GrIDVIEw中展示所有的图片,其中第一个item可以去照相;获取到图片后再进行剪切。
图片的剪切是从网上找的感觉不错就用,暂时也没有测试。
获取图片可以用:https://github.com/lovetuzitong/MultiImageSelector来实现
这里的圆形图像是用https://github.com/hdodenhof/CircleImageView来实现的
Demo写的比较粗糙,效果只是在4.4的手机和7.0的模拟器跑了一遍,所以可能会出现问题的。
如下是demo的效果图:
如下是选择图片中的代码
通过LoaderManager来获取到所有的图片,然后第一个进行拍照的处理
package com.item.demo.photo.activity;import androID.Manifest;import androID.app.LoaderManager;import androID.content.ContentResolver;import androID.content.Context;import androID.content.CursorLoader;import androID.content.Intent;import androID.content.Loader;import androID.content.pm.PackageManager;import androID.database.Cursor;import androID.net.Uri;import androID.os.Build;import androID.os.Environment;import androID.provIDer.MediaStore;import androID.support.annotation.NonNull;import androID.support.v4.content.ContextCompat;import androID.support.v4.content.fileProvIDer;import androID.support.v7.app.AppCompatActivity;import androID.os.Bundle;import androID.text.TextUtils;import androID.util.Log;import androID.vIEw.VIEw;import androID.Widget.AdapterVIEw;import androID.Widget.GrIDVIEw;import androID.Widget.ImageVIEw;import com.item.demo.photo.BuildConfig;import com.item.demo.photo.R;import com.item.demo.photo.adapter.MyPhotoAdapter;import com.item.demo.photo.uilts.Image;import java.io.file;import java.util.ArrayList;import java.util.List;/** * 图片选择界面 */public class MyPhotoActivity extends AppCompatActivity { private static final int REQUEST_CAPTURE = 100; //private static final int REQUEST_PICK = 101; private static final int REQUEST_CROP_PHOTO = 102; public static final int FINSH_RESulT = 104;//截图后的返回 private static final int LOADER_ID = 0x0100; private LoadCallBack mload = new LoadCallBack(); private MyPhotoAdapter mAdapter; private List<Image> images = new ArrayList<>(); //调用照相机返回图片文件 private file tempfile; private static final int MIN_IMAGE_file_SIZE = 10 * 1024; // 最小的图片大小 @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_my_photo); GrIDVIEw gv_photo = (GrIDVIEw)findVIEwByID(R.ID.gv_photo); ImageVIEw img_back = (ImageVIEw)findVIEwByID(R.ID.iv_back); images.add(new Image()); mAdapter = new MyPhotoAdapter(this,images); gv_photo.setAdapter(mAdapter); gv_photo.setonItemClickListener(new AdapterVIEw.OnItemClickListener() { @OverrIDe public voID onItemClick(AdapterVIEw<?> adapterVIEw,VIEw vIEw,int i,long l) { if(i == 0){ //第一个就去照相 if(hasPermission(new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE})){ gotoCamera(); }else { requestPermission(0x02,new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE}); } }else { //这里点击获取到图片地址然后裁剪 gotoClipActivity(Uri.parse(images.get(i).getPath())); } } }); img_back.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw vIEw) { finish(); } }); } @OverrIDe protected voID onStart() { super.onStart(); if(hasPermission(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE})){ getLoaderManager().initLoader(LOADER_ID,null,mload); }else { requestPermission(0x01,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}); } } private class LoadCallBack implements LoaderManager.LoaderCallbacks<Cursor>{ private final String[] IMAGE_PROJECTION = new String[]{ MediaStore.Images.Media._ID,//ID MediaStore.Images.Media.DATA,//图片路径 MediaStore.Images.Media.DATE_ADDED//图片的创建时间 }; @OverrIDe public Loader<Cursor> onCreateLoader(int ID,Bundle args) { //创建一个Loader if(ID == LOADER_ID){ //如果是我们的ID则进行初始化 return new CursorLoader(getBaseContext(),MediaStore.Images.Media.EXTERNAL_CONTENT_URI,IMAGE_PROJECTION,IMAGE_PROJECTION[2] + " DESC"); } return null; } @OverrIDe public voID onLoadFinished(Loader<Cursor> loader,Cursor data) { //当Loader加载完成时 List<Image> images = new ArrayList<>(); //判断是否有数据 if(data != null){ int count = data.getCount(); if(count > 0){ data.movetoFirst(); // 得到对应的列的Index坐标 int indexID = data.getColumnIndexOrThrow(IMAGE_PROJECTION[0]); int indexPath = data.getColumnIndexOrThrow(IMAGE_PROJECTION[1]); int indexDate = data.getColumnIndexOrThrow(IMAGE_PROJECTION[2]); do { // 循环读取,直到没有下一条数据 int ID = data.getInt(indexID); String path = data.getString(indexPath); long dateTime = data.getLong(indexDate); file file = new file(path); if (!file.exists() || file.length() < MIN_IMAGE_file_SIZE) { // 如果没有图片,或者图片大小太小,则跳过 continue; } // 添加一条新的数据 Image image = new Image(); image.setID(ID); image.setPath(path); image.setDate(dateTime); images.add(image); } while (data.movetoNext()); } } updateSource(images); } @OverrIDe public voID onLoaderreset(Loader<Cursor> loader) { updateSource(null); } } /** * 通知Adapter数据更改的方法 * @param images 新的数据 */ private voID updateSource(List<Image> images){ this.images.clear(); this.images.add(new Image()); if(images == null || images.size() == 0) return; this.images.addAll(images); mAdapter.notifyDataSetChanged(); } /** *权限的返回 */ @OverrIDe public voID onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode,permissions,grantResults); switch(requestCode){ case 0x02: if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ gotoCamera(); } break; case 0x01: if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ getLoaderManager().initLoader(LOADER_ID,mload); } } } @OverrIDe protected voID onActivityResult(int requestCode,int resultCode,Intent data) { super.onActivityResult(requestCode,resultCode,data); switch (requestCode){ case REQUEST_CAPTURE://系统相机返回 if(resultCode == RESulT_OK){ Log.d("jIEjIE","--------相机---------" + Uri.fromfile(tempfile).toString()); Log.d("jIEjIE","--------path----------" + getRealfilePathFromUri(MyPhotoActivity.this,Uri.fromfile(tempfile))); gotoClipActivity(Uri.fromfile(tempfile)); } break; case REQUEST_CROP_PHOTO: if(resultCode == RESulT_OK){ if(data != null){ Uri uri = data.getData(); Log.d("jIEjIE","-------------" + data.getData().getPath()); String cropImagePath = getRealfilePathFromUri(MyPhotoActivity.this,uri); Log.d("jIEjIE","------crop--------" + cropImagePath); Intent intent = new Intent(); intent.putExtra("image",cropImagePath); setResult(FINSH_RESulT,intent); MyPhotoActivity.this.finish(); } } break; } } /** * 跳转到系统照相机 */ private voID gotoCamera(){ String SDState = Environment.getExternalStorageState(); //判断SD卡是否存在 if(SDState.equals(Environment.MEDIA_MOUNTED)){ tempfile = new file(checkDirPath(Environment.getExternalStorageDirectory().getPath()+ "/image/"),System.currentTimeMillis() + ".jpg"); //隐式的打开调用系统相册 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){ intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); //如果是7.0及以上的系统使用fileProvIDer的方式创建一个Uri Uri contentUri = fileProvIDer.getUriForfile(MyPhotoActivity.this,BuildConfig.APPliCATION_ID + ".fileProvIDer",tempfile); intent.putExtra(MediaStore.EXTRA_OUTPUT,contentUri); }else { intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromfile(tempfile)); } startActivityForResult(intent,REQUEST_CAPTURE); } } /** * 打开截图的界面 * @param uri */ private voID gotoClipActivity(Uri uri){ if(uri == null){ return; } Intent intent = new Intent(this,ClipImageActivity.class); intent.putExtra("type",1); intent.setData(uri); startActivityForResult(intent,REQUEST_CROP_PHOTO); } /** * 检查文件是否存在 */ private static String checkDirPath(String dirPath) { if (TextUtils.isEmpty(dirPath)) { return ""; } file dir = new file(dirPath); if (!dir.exists()) { dir.mkdirs(); } return dirPath; } /** * 判断是否有指定的权限 */ public boolean hasPermission(String... permissions) { for (String permisson : permissions) { if (ContextCompat.checkSelfPermission(this,permisson) != PackageManager.PERMISSION_GRANTED) { return false; } } return true; } /** * 申请指定的权限. */ public voID requestPermission(int code,String... permissions) { if (Build.VERSION.SDK_INT >= 23) { requestPermissions(permissions,code); } } /** * 根据Uri返回文件绝对路径 * 兼容了file:///开头的 和 content://开头的情况 */ public static String getRealfilePathFromUri(final Context context,final Uri uri) { if (null == uri) return null; final String scheme = uri.getScheme(); String data = null; if (scheme == null) data = uri.getPath(); else if (ContentResolver.SCHEME_file.equals(scheme)) { data = uri.getPath(); } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) { Cursor cursor = context.getContentResolver().query(uri,new String[]{MediaStore.Images.ImageColumns.DATA},null); if (null != cursor) { if (cursor.movetoFirst()) { int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); if (index > -1) { data = cursor.getString(index); } } cursor.close(); } } return data; }}其中处理动态的权限还需要添加7.0的照相处理
在清单文件中加如下配置:
<provIDer androID:name="androID.support.v4.content.fileProvIDer" androID:authoritIEs="com.item.demo.photo.fileProvIDer" androID:grantUriPermissions="true" androID:exported="false"> <Meta-data androID:name="androID.support.file_PROVIDER_PATHS" androID:resource="@xml/file_paths" /> </provIDer>
图片的剪切
package com.item.demo.photo.activity;import androID.content.Intent;import androID.graphics.Bitmap;import androID.net.Uri;import androID.support.v7.app.AppCompatActivity;import androID.os.Bundle;import androID.util.Log;import androID.vIEw.VIEw;import androID.Widget.ImageVIEw;import androID.Widget.TextVIEw;import com.item.demo.photo.R;import com.item.demo.photo.vIEw.ClipVIEwLayout;import java.io.file;import java.io.IOException;import java.io.OutputStream;/** * 图片剪切 */public class ClipImageActivity extends AppCompatActivity implements VIEw.OnClickListener { private ClipVIEwLayout clipVIEwLayout1; private ClipVIEwLayout clipVIEwLayout2; private ImageVIEw back; private TextVIEw tv_ok; //类别 1:圆形 2:方形 private int type; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_clip_image); type = getIntent().getIntExtra("type",1); initVIEw(); } private voID initVIEw() { clipVIEwLayout1 = (ClipVIEwLayout)findVIEwByID(R.ID.clipVIEwLayout1); clipVIEwLayout2 = (ClipVIEwLayout)findVIEwByID(R.ID.clipVIEwLayout2); back = (ImageVIEw)findVIEwByID(R.ID.iv_back); tv_ok = (TextVIEw)findVIEwByID(R.ID.tv_ok); back.setonClickListener(this); tv_ok.setonClickListener(this); } @OverrIDe protected voID onResume() { super.onResume(); if(type == 1){ clipVIEwLayout1.setVisibility(VIEw.VISIBLE); clipVIEwLayout2.setVisibility(VIEw.GONE); //设置图片资源 clipVIEwLayout1.setimageSrc(getIntent().getData()); }else { clipVIEwLayout2.setVisibility(VIEw.VISIBLE); clipVIEwLayout1.setVisibility(VIEw.GONE); clipVIEwLayout2.setimageSrc(getIntent().getData()); } } @OverrIDe public voID onClick(VIEw vIEw) { switch (vIEw.getID()){ case R.ID.iv_back: finish(); break; case R.ID.tv_ok: generateUriAndReturn(); break; } } /** * 生成Uri并且通过setResult返回给打开的Activity */ private voID generateUriAndReturn() { //调用返回剪切图 Bitmap zoomedCropBitmap; if (type == 1) { zoomedCropBitmap = clipVIEwLayout1.clip(); } else { zoomedCropBitmap = clipVIEwLayout2.clip(); } if (zoomedCropBitmap == null) { Log.e("androID","zoomedCropBitmap == null"); return; } Uri mSaveUri = Uri.fromfile(new file(getCacheDir(),"cropped_" + System.currentTimeMillis() + ".jpg")); if (mSaveUri != null) { OutputStream outputStream = null; try { outputStream = getContentResolver().openOutputStream(mSaveUri); if (outputStream != null) { zoomedCropBitmap.compress(Bitmap.CompressFormat.JPEG,90,outputStream); } } catch (IOException ex) { Log.e("androID","Cannot open file: " + mSaveUri,ex); } finally { if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printstacktrace(); } } } Intent intent = new Intent(); intent.setData(mSaveUri); setResult(RESulT_OK,intent); finish(); } }}总结
以上所述是小编给大家介绍的AndroID头像上传功能的实现代码(获取头像加剪切),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!
总结以上是内存溢出为你收集整理的Android头像上传功能的实现代码(获取头像加剪切)全部内容,希望文章能够帮你解决Android头像上传功能的实现代码(获取头像加剪切)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)