Share two ways to implement Android image selection

  • 2020-12-26 05:52:46
  • OfStack

Android selects images in two ways:

Type 1: Leaflet selection

By implicitly starting activity, jump to the album and select 1 to return results

The key codes are as follows:

Send request:


private static final int PICTURE = 10086; //requestcode

Intent intent = new Intent();
if (Build.VERSION.SDK_INT < 19) {// because Android SDK in 4.4 Post version picture action Changes in the   So let's make the judgment here 1 Under the 
      intent.setAction(Intent.ACTION_GET_CONTENT);
    } else {
      intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
    }
    intent.setType("image/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent, PICTURE);

Results received:


@Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (data == null) {
      this.finish();
      return;
    }
    Uri uri = data.getData();
    switch (requestCode) {
      case PICTURE:
        image = FileUtils.getUriPath(this, uri); // (because the 4.4 After the picture uri Changes have been made) through the file tool class   right uri Parse to get the picture path 
        break;
      default:
        break;
    }
    this.finish();
  }

File tools:


public class FileUtils {
  private static final String TAG = "FileUtils";
  private static final boolean DEBUG = false;
  /**
   *  Gets the readable file size 
   */
  public static String getReadableFileSize(int size) {
    final int BYTES_IN_KILOBYTES = 1024;
    final DecimalFormat dec = new DecimalFormat("###.#");
    final String KILOBYTES = " KB";
    final String MEGABYTES = " MB";
    final String GIGABYTES = " GB";
    float fileSize = 0;
    String suffix = KILOBYTES;
    if(size > BYTES_IN_KILOBYTES) {
      fileSize = size / BYTES_IN_KILOBYTES;
      if(fileSize > BYTES_IN_KILOBYTES) {
        fileSize = fileSize / BYTES_IN_KILOBYTES;
        if(fileSize > BYTES_IN_KILOBYTES) {
          fileSize = fileSize / BYTES_IN_KILOBYTES;
          suffix = GIGABYTES;
        } else {
          suffix = MEGABYTES;
        }
      }
    }
    return String.valueOf(dec.format(fileSize) + suffix);
  }
  /**
   *  Gets the file name of the file ( Extensions are not included )
   */
  public static String getFileNameWithoutExtension(String path) {
    if(path == null) {
      return null;
    }
    int separatorIndex = path.lastIndexOf(File.separator);
    if(separatorIndex < 0) {
      separatorIndex = 0;
    }
    int dotIndex = path.lastIndexOf(".");
    if(dotIndex < 0) {
      dotIndex = path.length();
    } else if(dotIndex < separatorIndex) {
      dotIndex = path.length();
    }
    return path.substring(separatorIndex + 1, dotIndex);
  }
  /**
   *  Get file name 
   */
  public static String getFileName(String path) {
    if(path == null) {
      return null;
    }
    int separatorIndex = path.lastIndexOf(File.separator);
    return (separatorIndex < 0) ? path : path.substring(separatorIndex + 1, path.length());
  }
  /**
   *  Get extension 
   */
  public static String getExtension(String path) {
    if(path == null) {
      return null;
    }
    int dot = path.lastIndexOf(".");
    if(dot >= 0) {
      return path.substring(dot);
    } else {
      return "";
    }
  }
  public static File getUriFile(Context context, Uri uri) {
    String path = getUriPath(context, uri);
    if(path == null) {
      return null;
    }
    return new File(path);
  }
  public static String getUriPath(Context context, Uri uri) {
    if(uri == null) {
      return null;
    }
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context, uri)) {
      if("com.android.externalstorage.documents".equals(uri.getAuthority())) {
        final String docId = DocumentsContract.getDocumentId(uri);
        final String[] split = docId.split(":");
        final String type = split[0];
        if("primary".equalsIgnoreCase(type)) {
          return Environment.getExternalStorageDirectory() + "/" + split[1];
        }
      } else if("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
        final String id = DocumentsContract.getDocumentId(uri);
        final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
        return getDataColumn(context, contentUri, null, null);
      } else if("com.android.providers.media.documents".equals(uri.getAuthority())) {
        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(context, contentUri, selection, selectionArgs);
      }
    } else if("content".equalsIgnoreCase(uri.getScheme())) {
      if("com.google.android.apps.photos.content".equals(uri.getAuthority())) {
        return uri.getLastPathSegment();
      }
      return getDataColumn(context, uri, null, null);
    } else if("file".equalsIgnoreCase(uri.getScheme())) {
      return uri.getPath();
    }
    return null;
  }
  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, selection, selectionArgs, null);
      if(cursor != null && cursor.moveToFirst()) {
        final int column_index = cursor.getColumnIndexOrThrow(column);
        return cursor.getString(column_index);
      }
    } finally {
      if(cursor != null) cursor.close();
    }
    return null;
  }
}

The second way to batch select pictures

If we need to select more than one picture at a time like WeChat, it is obvious that the first method cannot meet the demand, then how can we select in batches? andorid also provides a direct method of bulk selection like sheet selection, so we have to get it from the database ourselves.

The first thing to realize is that class mediastore android stores all the multimedia files in this database, such as pictures, videos, audio, etc., and it provides the interface for data to other processes through contentprovider

To get data from mediastore, we can use ContentResolver, which corresponds to ContentProvider

Key code:


 final String[] projectionPhotos = {
        MediaStore.Images.Media._ID,// every 1 The column ID  The image ID
        MediaStore.Images.Media.BUCKET_ID,// Folder where the picture is located ID
        MediaStore.Images.Media.BUCKET_DISPLAY_NAME,// Name of the folder in which the image resides 
        MediaStore.Images.Media.DATA,// Image path 
        MediaStore.Images.Media.DATE_TAKEN,// Picture creation time 
    };

 
cursor = MediaStore.Images.Media.query(context.getContentResolver(), MediaStore.Images.Media.EXTERNAL_CONTENT_URI
    , projectionPhotos, "", null, MediaStore.Images.Media.DATE_TAKEN + " DESC");

All the images are in cursor and you can just take them out of cursor


Related articles: