国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

分享實現Android圖片選擇的兩種方式

2020-04-11 10:57:26
字體:
來源:轉載
供稿:網友

Android選擇圖片的兩種方式:

第一種:單張選取

通過隱式啟動activity,跳轉到相冊選擇一張返回結果

關鍵代碼如下:

發送請求:

private static final int PICTURE = 10086; //requestcodeIntent intent = new Intent();if (Build.VERSION.SDK_INT < 19) {//因為Android SDK在4.4版本后圖片action變化了 所以在這里先判斷一下      intent.setAction(Intent.ACTION_GET_CONTENT);    } else {      intent.setAction(Intent.ACTION_OPEN_DOCUMENT);    }    intent.setType("image/*");    intent.addCategory(Intent.CATEGORY_OPENABLE);startActivityForResult(intent, PICTURE);

接收結果:

@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); //(因為4.4以后圖片uri發生了變化)通過文件工具類 對uri進行解析得到圖片路徑        break;      default:        break;    }    this.finish();  }

文件工具類:

public class FileUtils {  private static final String TAG = "FileUtils";  private static final boolean DEBUG = false;  /**   * 獲取可讀的文件大小   */  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);  }  /**   * 獲取文件的文件名(不包括擴展名)   */  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);  }  /**   * 獲取文件名   */  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());  }  /**   * 獲取擴展名   */  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;  }}

第二種方式 批量選擇圖片

如果我們需要類似于微信那樣的一次選取多張圖片,很明顯第一種方式是不能滿足需求,那么怎么才能批量選取呢?andorid并提供像單張選取似的批量選取的直接方法,所以我們只能自己從數據庫中獲得。

首先我們要認識一個類mediastore  android中所有的多媒體文件都存儲在這個數據庫中,例如圖片 視頻 音頻 等等,他通過contentprovider 向其他進程提供數據的接口

想要從mediastore中獲得數據,我們可以使用與ContentProvider 對應的ContentResolver

關鍵代碼:

 final String[] projectionPhotos = {        MediaStore.Images.Media._ID,//每一列的ID 圖片的ID        MediaStore.Images.Media.BUCKET_ID,//圖片所在文件夾ID        MediaStore.Images.Media.BUCKET_DISPLAY_NAME,//圖片所在文件夾名稱        MediaStore.Images.Media.DATA,//圖片路徑        MediaStore.Images.Media.DATE_TAKEN,//圖片創建時間    }; cursor = MediaStore.Images.Media.query(context.getContentResolver(), MediaStore.Images.Media.EXTERNAL_CONTENT_URI    , projectionPhotos, "", null, MediaStore.Images.Media.DATE_TAKEN + " DESC");

所有圖片都在cursor里了 再從cursor中取出即可

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁武县| 永福县| 漯河市| 孟州市| 黄平县| 布尔津县| 广德县| 平泉县| 万载县| 苗栗市| 桦南县| 哈密市| 城市| 阿拉善左旗| 定襄县| 昌宁县| 韶关市| 虎林市| 漳州市| 武宣县| 饶河县| 丁青县| 航空| 洪江市| 云霄县| 镶黄旗| 陇南市| 化隆| 双鸭山市| 武隆县| 贺州市| 深圳市| 柳河县| 乐清市| 桦南县| 崇义县| 济源市| 尼勒克县| 舒兰市| 建宁县| 仙居县|