因为项目中需要用到头像上传的功能,所以就下个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, null, null, 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); } } 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,null,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); } } 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); } } 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, null, 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; }}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容- 如何在 Java 中求平均值?(java怎么求平均值)
- Redis客户端自动化操作:提升效率与准确性
- Java 如何打印数组的全部内容?(java怎么打印数组全部内容)
- 在IDEA中如何配置Java开发环境?(IDEA中怎么配置Java开发环境)
- Java NoSQL 分布式部署的具体步骤是怎样的?(java nosql分布式部署如何进行)
- Java 依赖倒置原则的作用究竟是什么?(java依赖倒置的作用是什么)
- Redis客户端日志分析技巧:提升数据监控与性能优化
- Java Quarter 数据校准的详细步骤及技巧(java quarter如何进行数据校准)
- Java 中线程间通信的方法有哪些?(java线程间通信的方法是什么)
- Java 多线程批量处理的方法究竟有哪些?(java多线程批量处理的方法是什么)
猜你喜欢
AI推送时光机Android头像上传功能的实现代码(获取头像加剪切)
后端开发2023-05-30
jQuery插件ImgAreaSelect如何实现头像上传预览和裁剪功能
后端开发2024-04-02
jQuery插件ImgAreaSelect怎么实现头像上传预览和裁剪功能
后端开发2023-06-04
Android个人中心的头像上传,图片编码及截取实例
后端开发2022-06-06
node+vue实现用户注册和头像上传的实例代码
后端开发2022-06-04
Android开发实现ImageView加载摄像头拍摄的大图功能
后端开发2023-05-30
咦!没有更多了?去看看其它编程学习网 内容吧