Android获取手机内存图片展示
发布时间:2017-05-19 12:43:48 所属栏目:安卓资讯 来源:www.jianshu.com
导读:效果图photo.png需求:获取手机内存中的所有图片,以及拍照图片。可勾选上传到服务器。本文只实现了获取内存中的所有图片展示勾选,但未放置上传服务器代码。毕竟服务器各不相同且上传只需IO操作首页布局RecyclerView,就不...
|
副标题[/!--empirenews.page--]
效果图photo.png需求:获取手机内存中的所有图片,以及拍照图片。可勾选上传到服务器。本文只实现了获取内存中的所有图片展示勾选,但未放置上传服务器代码。毕竟服务器各不相同且上传只需IO操作首页布局RecyclerView,就不... 效果图![]() 需求: 获取手机内存中的所有图片,以及拍照图片。可勾选上传到服务器。 本文只实现了获取内存中的所有图片展示勾选,但未放置上传服务器代码。毕竟服务器各不相同且上传只需IO操作 首页布局RecyclerView,就不上布局代码了。直接上整体首页代码public class PhotoListActivity extends AppCompatActivity implements View.OnClickListener { private RecyclerView recycManager; private LoaderManager.LoaderCallbacks<Cursor> loaderCallbacks;//图片加载器 private Activity mActivity = null; private ArrayList<PhotoInfo> photoInfoList = new ArrayList<>(); private PhotoAdapter photoAdapter; private File path; private TextView textNumber; private TextView textEnter; private ArrayList<String> resultList = new ArrayList<>();//返回首页的集合 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_photo_list); initView(); initListener(); initPhoto(); initRecycler(); } private void initView() { mActivity = this; recycManager = (RecyclerView) findViewById(R.id.recycManager); textNumber = (TextView) findViewById(R.id.textNumber); textEnter = (TextView) findViewById(R.id.textEnter); textNumber.setText("(" + 0 + "/9" + ")"); } private void initListener() { textEnter.setOnClickListener(this); } private File createCreamePath; private void initRecycler() { GridLayoutManager gridLayoutManager = new GridLayoutManager(mActivity, 3); recycManager.setLayoutManager(gridLayoutManager); photoAdapter = new PhotoAdapter(mActivity, photoInfoList); recycManager.setAdapter(photoAdapter); photoAdapter.getPhoto(new PhotoAdapter.getPhoto() { @Override public void getTakeCreame(View v) { Intent intentPhone = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); createCreamePath = createTmpFile(mActivity, "/Edreamoon/Pictures"); intentPhone.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(createCreamePath)); intentPhone.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); startActivityForResult(intentPhone, 100); } }); photoAdapter.getSelectPhoto(new PhotoAdapter.getSelectPhoto() { @Override public void getListPhoto(List<String> photoPath) { resultList.clear(); int size = photoPath.size(); textNumber.setText("(" + size + "/9" + ")"); if (size > 0) { textEnter.setVisibility(View.VISIBLE); } else { textEnter.setVisibility(View.GONE); } //获取选择集合赋值给 返回MAIN集合 for (String path : photoPath) { if (resultList.contains(path)) { resultList.remove(path); } else { resultList.add(path); } } } }); } private void initPhoto() { loaderCallbacks = new LoaderManager.LoaderCallbacks<Cursor>() { private final String[] IMAGE_PROJECT = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.DATE_ADDED, MediaStore.Images.Media._ID, MediaStore.Images.Media.SIZE, }; @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { if (id == 0) { return new CursorLoader(mActivity, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECT, null, null, IMAGE_PROJECT[2] + " DESC"); } else if (id == 1) { return new CursorLoader(mActivity, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECT, IMAGE_PROJECT[0] + "like '%" + args.getString("path") + "%'", null, IMAGE_PROJECT[2] + " DESC"); } return null; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { if (data != null) { photoInfoList.clear(); int count = data.getCount(); data.moveToFirst(); if (count > 0) { do { String path = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECT[0])); String name = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECT[1])); long time = data.getLong(data.getColumnIndexOrThrow(IMAGE_PROJECT[2])); int size = data.getInt(data.getColumnIndexOrThrow(IMAGE_PROJECT[4])); PhotoInfo photoInfo = new PhotoInfo(path, name, time, false); Boolean isSize5k = size > 1024 5; if (isSize5k) { photoInfoList.add(photoInfo); } } while (data.moveToNext()); } } } @Override public void onLoaderReset(Loader<Cursor> loader) { } }; getSupportLoaderManager().restartLoader(0, null, loaderCallbacks); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 100 && resultCode == RESULT_OK) { resultList.clear(); String absolutePath = createCreamePath.getAbsolutePath(); resultList.add(absolutePath); Intent intent = new Intent(mActivity, MainActivity.class); intent.putExtra("resultPath", resultList); setResult(200, intent); finish(); } } /* 创建文件 @param context context @param filePath 文件路径 @return file / public static File createTmpFile(Context context, String filePath) { String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA).format(new Date()); String externalStorageState = Environment.getExternalStorageState(); File dir = new File(Environment.getExternalStorageDirectory() + filePath); if (externalStorageState.equals(Environment.MEDIA_MOUNTED)) { if (!dir.exists()) { dir.mkdirs(); } return new File(dir, timeStamp + ".jpg"); } else { File cacheDir = context.getCacheDir(); return new File(cacheDir, timeStamp + ".jpg"); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.textEnter: Intent intent = new Intent(mActivity, MainActivity.class); intent.putExtra("resultPath", resultList); setResult(200, intent); finish(); break; } }}adapter代码public class PhotoAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context mContext; private List<PhotoInfo> list; private LayoutInflater inflater; private getPhoto getPhoto; private List<String> selectPhoto = new ArrayList<>(); private getSelectPhoto getSelectPhoto; public PhotoAdapter(Context mContext, List<PhotoInfo> list) { this.mContext = mContext; this.list = list; inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); selectPhoto.clear(); } public void getPhoto(getPhoto getPhoto) { this.getPhoto = getPhoto; } public void getSelectPhoto(getSelectPhoto getSelectPhoto) { this.getSelectPhoto = getSelectPhoto; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == 0) {//显示的第一张图片的布局 , 就是调用摄像头拍照的布局。 return new MyViewHolder(inflater.inflate(R.layout.item_photo_adapter_first, parent, false)); }//之后的图片显示的布局。 return new MyViewHolder(inflater.inflate(R.layout.item_photo_adapter, parent, false)); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { holder.setIsRecyclable(false); ViewGroup.LayoutParams params = holder.itemView.getLayoutParams(); params.height = getScreenWidth(mContext) / 3; params.width = getScreenWidth(mContext) / 3; holder.itemView.setLayoutParams(params);//重设item大小 if (getItemViewType(position) == 0) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //因为拍照要返回参数,所以接口回调方式将事件处理交给activity处理 getPhoto.getTakeCreame(v); } }); return; } final MyViewHolder myViewHolder = (MyViewHolder) holder; final PhotoInfo photoInfo = list.get(position - 1); Glide.with(mContext).load(photoInfo.path).into(myViewHolder.image); myViewHolder.image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (selectPhoto.size() < 9) { //selectPhoto为选中的集合。 if (selectPhoto.contains(photoInfo.path)) { selectPhoto.remove(photoInfo.path); photoInfo.setChecked(false); myViewHolder.checkBox.setButtonDrawable(R.mipmap.uncheck); } else { selectPhoto.add(photoInfo.path); photoInfo.setChecked(true); myViewHolder.checkBox.setButtonDrawable(R.mipmap.checked); } myViewHolder.checkBox.setChecked(photoInfo.getChecked()); getSelectPhoto.getListPhoto(selectPhoto); } else { if (selectPhoto.contains(photoInfo.path)) { selectPhoto.remove(photoInfo.path); photoInfo.setChecked(false); myViewHolder.checkBox.setButtonDrawable(R.mipmap.uncheck); } else { Toast.makeText(mContext, "最多选择9张", Toast.LENGTH_SHORT).show(); } } } }); if (photoInfo.getChecked()) { myViewHolder.checkBox.setChecked(photoInfo.getChecked()); myViewHolder.checkBox.setButtonDrawable(R.mipmap.checked); } else { myViewHolder.checkBox.setButtonDrawable(R.mipmap.uncheck); } } @Override public int getItemViewType(int position) { if (position == 0) { return 0; } return 1; } @Override public int getItemCount() { return list.size(); } class MyViewHolder extends RecyclerView.ViewHolder { private ImageView image; private CheckBox checkBox; public MyViewHolder(View itemView) { super(itemView); image = (ImageView) itemView.findViewById(R.id.image); checkBox = (CheckBox) itemView.findViewById(R.id.checkbox); } } /* 获得屏幕高度 @param context context @return 屏幕高度 / public int getScreenWidth(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics); return outMetrics.widthPixels; } //获取拍照后的照片 public interface getPhoto { void getTakeCreame(View v); } public interface getSelectPhoto { void getListPhoto(List<String> photoPath); }}模型类public class PhotoInfo { public String name; // 图片名 public String path; // 图片路径 public long time; // 图片添加时间 public Boolean checked; //checkbox 选中状态 public PhotoInfo(String path, String name, long time ,Boolean checked) { this.path = path; this.name = name; this.time = time; this.checked =checked; } public Boolean getChecked() { return checked; } public void setChecked(Boolean checked) { this.checked = checked; } @Override public String toString() { return "PhotoInfo{" + "name='" + name + ''' + ", path='" + path + ''' + ", time=" + time + '}'; } @Override public boolean equals(Object object) { try { PhotoInfo other = (PhotoInfo) object; return this.path.equalsIgnoreCase(other.path); } catch (ClassCastException e) { e.printStackTrace(); } return super.equals(object); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public long getTime() { return time; } public void setTime(long time) { this.time = time; }}具体思路(编辑:52刷机网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读





