真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何在Android應(yīng)用中實(shí)現(xiàn)一個(gè)圖庫(kù)輔助器功能

如何在Android應(yīng)用中實(shí)現(xiàn)一個(gè)圖庫(kù)輔助器功能?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

杭錦后網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)自2013年起到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

實(shí)現(xiàn)步驟

第一步,創(chuàng)建輔助類,使用弱引用持有Activity,防止內(nèi)存溢出。

  public class GalleryHelper{

    private Activity mActivity;

    public GalleryHelper(Activity activity) {
      mActivity = new WeakReference<>(activity).get();
    }
  }

第二步,創(chuàng)建文件夾實(shí)體類,代表文件夾數(shù)據(jù)。paths集合是文件夾下的所有路徑。

public final class FolderEntity {

  private int num;
  private String name;
  private List paths = new ArrayList<>();

  public int getNum() {
    return paths.size();
  }

  public List getPaths() {
    return paths;
  }

  public void setName(String name) {
    this.name = name;
  }
}

第三步,首先獲取手機(jī)所有的圖片,在Activity里有g(shù)etLoaderManager方法獲取一個(gè)LoaderManager實(shí)例,該類用于異步加載手機(jī)內(nèi)數(shù)據(jù)監(jiān)測(cè),這里不做多分析。我們調(diào)用它的initLoader方法,前兩個(gè)參數(shù)這里不需要,只要實(shí)現(xiàn)LoaderCallbacks接口,并且指定Cursor類型。LoaderCallbacks接口有三個(gè)覆蓋方法,我們需要用到的是onCreateLoader方法和onLoadFinished方法,前者是初始化Loader,后者是加載完成后的回調(diào)。

  mActivity.getLoaderManager().initLoader(0, null, new LoaderManager.LoaderCallbacks() {
      @Override
      public Loader onCreateLoader(int i, Bundle bundle) {
      }

      @Override
      public void onLoadFinished(Loader loader, Cursor cursor) {
      }

      @Override
      public void onLoaderReset(Loader loader) {

      }
    });

在onCreateLoader方法里,初始化CursorLoader,參數(shù)跟Cursor類下的query一樣,第一個(gè)參數(shù)指定外部村粗多媒體URI;第二個(gè)參數(shù)是查找結(jié)果字段,這里只要了路徑;第三個(gè)參數(shù)和第四個(gè)參數(shù)是搜索條件,條件為搜索jpeg格式和png格式,最后一個(gè)是按時(shí)間倒序搜索。

  public Loader onCreateLoader(int i, Bundle bundle) {
     return new CursorLoader(mActivity,
         MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
         new String[]{MediaStore.Images.Media.DATA},
         MediaStore.Images.Media.MIME_TYPE + "=? or "
             + MediaStore.Images.Media.MIME_TYPE + "=?",
         new String[]{"image/jpeg", "image/png"},
         MediaStore.Images.Media.DATE_ADDED + " DESC");
   }

CursorLoader初始化完成之后,搜索的結(jié)果會(huì)回調(diào)在onLoadFinished方法。這時(shí)就可以處理搜索出來(lái)的圖片路徑。因?yàn)閳D片路徑是沒(méi)有分類,這里采用HashMap分類,以文件夾路徑為key,具體文件夾FolderEntity類為value,如果當(dāng)前圖片路徑的文件夾不存在則創(chuàng)建FolderEntity并且放入HashMap,存在則獲取FolderEntity。

  public void onLoadFinished(Loader loader, Cursor cursor) {
     HashMap folderEntityHashMap = new HashMap();
      if (cursor != null) {
        while (cursor.moveToNext()) {
          //圖片路徑
          String path = cursor.getString(
          cursor.getColumnIndex(MediaStore.Images.Media.DATA));

          // 路徑不存在或者文件不存在就跳過(guò)
          File file = new File(path);
          if (TextUtils.isEmpty(path) || !file.exists()) {
            continue;
          }
          String folerPath = file.getParent();
          FolderEntity folderEntity;
          if (folderEntityHashMap.containsKey(folerPath)) {
            folderEntity = folderEntityHashMap.get(folerPath);
          } else {
            folderEntity = new FolderEntity();
            folderEntityHashMap.put(file.getParentFile().getName(), folderEntity);
          }
          folderEntity.getPaths().add(path);
        }
        cursor.close();
      }

    }

但是數(shù)據(jù)是要提供給外部的,HashMap就顯得很麻煩,所以要轉(zhuǎn)換ArrayList,并且按數(shù)量大小進(jìn)行順序。

    private ArrayList map2List(HashMap mediaBeanMap) {
      Iterator iterator = mediaBeanMap.values().iterator();
      ArrayList list = new ArrayList();
      while (iterator.hasNext()) {
        list.add(iterator.next());
      }
      Collections.sort(list, new Comparator() {
        @Override
        public int compare(FolderEntity lhs, FolderEntity rhs) {
          return lhs.getNum() > rhs.getNum() ? 1 : -1;
        }
      });
      return list;
    }

使用接口將數(shù)據(jù)提供給外部。

  public interface GalleryCallback {
    void complete(List list);
  }

  callback.complete(map2List(folderEntityHashMap));

第四步是實(shí)現(xiàn)拍照功能,這里實(shí)現(xiàn)是創(chuàng)建文件再啟動(dòng)拍照功能。

  File imageStoreDir = new File(Environment.getExternalStorageDirectory(),
      "/DCIM/" + mActivity.getResources().getString(R.string.app_name));
  if (!imageStoreDir.exists()) {
    imageStoreDir.mkdir();
  }
  Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  if (captureIntent.resolveActivity(mActivity.getPackageManager()) != null) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA);
    String filename = String.format("IMG%s", dateFormat.format(new Date()));
    imagePath = new File(imageStoreDir, filename).getAbsolutePath();
    captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(imagePath)));
    mActivity.startActivityForResult(new Intent(
        MediaStore.ACTION_IMAGE_CAPTURE), REQUEST_CODE);
  }

定義回調(diào)接口,接收Activit的onActivityResult方法,表示回調(diào)成功把上面創(chuàng)建好的文件路徑提供外部。

  public interface CameraCallback {
    void complete(String path);
  }

  public void onActivityResult(int requestCode, int resultCode) {
    if (Activity.RESULT_OK == resultCode && REQUEST_CODE == requestCode) {
      if (cameraCallback != null) {
        cameraCallback.complete(imagePath);
      }
    }
  }

外部調(diào)用

  galleryHelper = new GalleryHelper(this);
    galleryHelper.loadImages(new GalleryHelper.GalleryCallback() {
      @Override
      public void complete(List list) {
        //加載本地圖片返回結(jié)果
      }
    });

 findViewById(R.id.btn_camera).setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
       galleryHelper.openCamera(new GalleryHelper.CameraCallback() {
         @Override
         public void complete(String path) {
         //拍照返回結(jié)果
         }
       });
     }
   });

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //使用拍照,必須接收Activity的onActivityResult方法
    galleryHelper.onActivityResult(requestCode, resultCode);
  }

別忘了加權(quán)限,這里為了簡(jiǎn)單實(shí)現(xiàn),我把targetSdkVersion設(shè)置23以下,23和23以上的需要自行加上動(dòng)態(tài)權(quán)限。

  
  
  
  

關(guān)于如何在Android應(yīng)用中實(shí)現(xiàn)一個(gè)圖庫(kù)輔助器功能問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


網(wǎng)站題目:如何在Android應(yīng)用中實(shí)現(xiàn)一個(gè)圖庫(kù)輔助器功能
URL分享:http://weahome.cn/article/ggpdhe.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部