欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

分享實(shí)現(xiàn)Android圖片選擇的兩種方式

 更新時間:2016年01月17日 10:00:47   投稿:hebedich  
本文給大家分享的是Android選擇圖片的兩種方式的實(shí)現(xiàn)代碼,分別是單張選取和多張批量選取,非常的實(shí)用,有需要的小伙伴可以參考下

Android選擇圖片的兩種方式:

第一種:單張選取

通過隱式啟動activity,跳轉(zhuǎn)到相冊選擇一張返回結(jié)果

關(guān)鍵代碼如下:

發(fā)送請求:

private static final int PICTURE = 10086; //requestcode

Intent 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);

接收結(jié)果:

@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發(fā)生了變化)通過文件工具類 對uri進(jìn)行解析得到圖片路徑
        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);
  }
  /**
   * 獲取文件的文件名(不包括擴(kuò)展名)
   */
  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());
  }
  /**
   * 獲取擴(kuò)展名
   */
  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并提供像單張選取似的批量選取的直接方法,所以我們只能自己從數(shù)據(jù)庫中獲得。

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

想要從mediastore中獲得數(shù)據(jù),我們可以使用與ContentProvider 對應(yīng)的ContentResolver

關(guān)鍵代碼:

 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,//圖片創(chuàng)建時間
    };

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

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

相關(guān)文章

  • Android適配器(Adapter)的概念與自定義

    Android適配器(Adapter)的概念與自定義

    這篇文章主要給大家介紹了關(guān)于Android適配器(Adapter)的相關(guān)資料,適配器是一個非常重要的知識點(diǎn),Adapter是用來幫助填出數(shù)據(jù)的中間橋梁,本文介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • Android 中SP與DP的區(qū)別實(shí)例詳解

    Android 中SP與DP的區(qū)別實(shí)例詳解

    這篇文章主要介紹了Android 中SP與DP的區(qū)別實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • Android?Activity啟動流程刨析

    Android?Activity啟動流程刨析

    Activity作為Android四大組件之一,他的啟動絕對沒有那么簡單。這里涉及到了系統(tǒng)服務(wù)進(jìn)程,啟動過程細(xì)節(jié)很多,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值
    2022-08-08
  • Android上傳文件到Web服務(wù)器 PHP接收文件

    Android上傳文件到Web服務(wù)器 PHP接收文件

    這篇文章主要為大家詳細(xì)介紹了Android上傳文件到Web服務(wù)器,PHP接收文件的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android自定義View實(shí)現(xiàn)QQ消息氣泡

    Android自定義View實(shí)現(xiàn)QQ消息氣泡

    這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)QQ消息氣泡,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Android 組件樣式定制方法詳解

    Android 組件樣式定制方法詳解

    這篇文章主要介紹了Android 組件樣式定制方法詳解,需要的朋友可以參考下
    2015-10-10
  • Android實(shí)現(xiàn)截屏功能

    Android實(shí)現(xiàn)截屏功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)截屏功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Android NDK開發(fā)之:配置環(huán)境的詳解

    Android NDK開發(fā)之:配置環(huán)境的詳解

    本篇文章是對Android中的配置環(huán)境進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Android實(shí)現(xiàn)顯示電量的控件代碼

    Android實(shí)現(xiàn)顯示電量的控件代碼

    本文介紹了Android實(shí)現(xiàn)顯示電量的控件代碼,主要功能就是可以顯示電量,有需要的朋友可以來了解一下。
    2016-10-10
  • Android實(shí)現(xiàn)廣告圖片輪播效果

    Android實(shí)現(xiàn)廣告圖片輪播效果

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)廣告圖片輪播效果的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-02-02

最新評論