Android high-imitation photos, multiple choice, preview, and delete (remove photos) album functions
First, it is better to declare that it is better to teach people and fish than to teach people and fish. Only one idea can be provided. Of course, if you need the source code, you can ask me the source code privately for a fee: QQ: 508181017.
After nearly three years of work, I have never been able to take photos of my own research system. Here, I came back with a high-imitation photo album function, multiple choice, preview, and delete (remove photos, all previously developed applications have this requirement, but they have never been practical! I will not talk much about it. Let's take a look at the following ideas:
1. photos can be saved locally and queried in real time (broadcast or service is not required)
2. Save the photo to the custom path and display the photos in different folders.
3. Specify multiple images.
4. The collections used include:
(1) All photo Sets
(2) Photo sets under different files
(3) folder set for saving photos by the System
(4) selected photo Sets
5. Each time you select and return to the upper-level interface, you must pass the selected photos to compare them with the currently displayed album set so that checkbox is checked.
6. Problems Encountered by myself include:
(1) setOnCheckedChangeListen of the CheckBox when the selected number of photos exceeds the specified numberEr events may encounter errors (not a bug, maybe my code logic is not rigorous enough), mainly when setting the setChecked (false | true) method that comes with the control; so I used the onClick method to achieve the selected state.
(2) preview the album and return to the upper-level (display the photos in the folder). Considering the performance, I used the map set to record and save the selected photos, when you call back the page, you can traverse the photos in the current folder to check whether the map set is included. If yes, the checkbox is selected.
(3) When you delete an image, your business is not the same. This project only allows the user to select and unselect the image and callback to the interface to display the desired effect.
7. Main Code:
(1) obtain the list of recent photos
public List
getCurrent() {Cursor cursor = resolver.query(Media.EXTERNAL_CONTENT_URI, new String[] { ImageColumns.DATA,ImageColumns.DATE_ADDED, ImageColumns.SIZE }, null, null, ImageColumns.DATE_ADDED);if (cursor == null || !cursor.moveToNext())return new ArrayList
();List
photos = new ArrayList
();cursor.moveToLast();do {if (cursor.getLong(cursor.getColumnIndex(ImageColumns.SIZE)) > 1024 * 10) {PhotoModel photoModel = new PhotoModel();photoModel.setOriginalPath(cursor.getString(cursor.getColumnIndex(ImageColumns.DATA)));photos.add(photoModel);}} while (cursor.moveToPrevious());return photos;}
(2) obtain the list of all albums
Public List getAlbums () {List albums = new ArrayList (); Map
Map = new HashMap
(); Cursor cursor = resolver. query (Media. EXTERNAL_CONTENT_URI, new String [] {ImageColumns. DATA, ImageColumns. BUCKET_DISPLAY_NAME, ImageColumns. SIZE}, null); if (cursor = null |! Cursor. moveToNext () return new ArrayList (); cursor. moveToLast (); AlbumModel current = new AlbumModel ("recent photo", 0, cursor. getString (cursor. getColumnIndex (ImageColumns. DATA), true); // "recent photo" album albums. add (current); do {if (cursor. getInt (cursor. getColumnIndex (ImageColumns. SIZE) <1024*10) continue; current. increaseCount (); String name = cursor. getString (cursor. getColumnIndex (ImageColumns. BUCKET_DISPLAY_NAME); if (map. keySet (). contains (name) map. get (name ). increaseCount (); else {AlbumModel album = new AlbumModel (name, 1, cursor. getString (cursor. getColumnIndex (ImageColumns. DATA); map. put (name, album); albums. add (album) ;}}while (cursor. moveToPrevious (); return albums ;}
(3) obtain the photos in the corresponding album.
public List
getAlbum(String name) {Cursor cursor = resolver.query(Media.EXTERNAL_CONTENT_URI, new String[] { ImageColumns.BUCKET_DISPLAY_NAME,ImageColumns.DATA, ImageColumns.DATE_ADDED, ImageColumns.SIZE }, "bucket_display_name = ?",new String[] { name }, ImageColumns.DATE_ADDED);if (cursor == null || !cursor.moveToNext())return new ArrayList
();List
photos = new ArrayList
();cursor.moveToLast();do {if (cursor.getLong(cursor.getColumnIndex(ImageColumns.SIZE)) > 1024 * 10) {PhotoModel photoModel = new PhotoModel();photoModel.setOriginalPath(cursor.getString(cursor.getColumnIndex(ImageColumns.DATA)));photos.add(photoModel);}} while (cursor.moveToPrevious());return photos;}
(4) Take a photo and update the local album in time
Public void photo () {// Intent openCameraIntent = new Intent (MediaStore. ACTION_IMAGE_CAPTURE); // startActivityForResult (openCameraIntent, TAKE_PICTURE); try {File dir = new File (Environment. getExternalStorageDirectory () + "/" + localTempImgDir); System. out. println ("image name:" + dir. getPath (); if (! Dir. exists () {dir. mkdirs ();} localTempImgFileName = System. currentTimeMillis () + ". jpg "; Intent intent = new Intent (android. provider. mediaStore. ACTION_IMAGE_CAPTURE); File f = new File (dir, localTempImgFileName); // localTempImgDir and localTempImageFileName are custom names Uri u = Uri. fromFile (f); intent. putExtra (MediaStore. images. media. ORIENTATION, 0); intent. putExtra (MediaStore. EXTRA_OUTPUT, u); startActivityForResult (intent, ResultTag. CODE_TOPHOTO);} catch (ActivityNotFoundException e) {Toast. makeText (PublishActivity. this, "No storage directory found", Toast. LENGTH_LONG ). show ();}}
(5) Take a photo and update the local album in time
@ Override protected void onActivityResult (int requestCode, int resultCode, Intent data) {super. onActivityResult (requestCode, resultCode, data); // The camera returns if (requestCode = ResultTag. CODE_TOPHOTO) {File f = new File (Environment. getExternalStorageDirectory () + "/" + localTempImgDir + "/" + localTempImgFileName); String sdStatus = Environment. getExternalStorageState (); if (! SdStatus. equals (Environment. MEDIA_MOUNTED) {// check whether the Log is available for sd. v ("TestFile", "SD card is not avaiable/writeable right now. "); return;} try {Uri u = Uri. parse (android. provider. mediaStore. images. media. insertImage (getContentResolver (), f. getAbsolutePath (), null, null); System. out. println ("Address:" + f. getAbsolutePath (); MediaScannerConnection. scanFile (this, new String [] {f. getAbsolutePath ()}, null, new MediaScannerConnection. onScanCompletedListener () {public void onScanCompleted (String path, Uri uri) {Log. I ("ExternalStorage", "Scanned" + path + ":"); Log. I ("ExternalStorage", "-> uri =" + uri) ;}});} catch (FileNotFoundException e) {e. printStackTrace ();} PhotoModel takePhoto = new PhotoModel (); takePhoto. setChecked (true); takePhoto. setOriginalPath (f. getAbsolutePath (); selectedShow. add (takePhoto); adapter. notifyDataSetChanged ();}}