2016-04-23 162 views
0

嗨讓所有圖片我想打一個畫廊APP在科爾多瓦6.1.1科爾多瓦的Android - 從設備

,我需要從設備

我這樣做對我的應用程序的iOS得到所有圖片版本「文件」和「AssetsLib」插件

https://github.com/glowmar/phonegap-plugin-assetslib

但我不知道怎麼做,在Android

+0

看看這個插件:[cordova-plugin-imagepicker](https://www.npmjs.com/package/cordova-plugin-imagepicker)。支持Android和iOS – utamanna

+0

不,我不希望用戶選擇圖片,我希望他們在屏幕上看到他們的所有圖片 –

回答

0

我已經創建了一個Android Gallery Project這在網格視圖獲取和顯示所有圖像和文件夾 -

https://github.com/hiteshsahu/AwesomeAndroid-Gallery

enter image description here

這與文件夾名的圖片文件夾的function返回地圖爲重點和ArrayList的圖像爲

public static Map<String, ArrayList<ImageDataModel>> getImageFolderMap(
      Activity activity) { 

     imageFolderMap.clear(); 

     Uri uri; 
     Cursor cursor; 
     int column_index_data, column_index_folder_name; 

     String absolutePathOfImage = null, folderName; 
     uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 

     String[] projection = { MediaColumns.DATA, 
       MediaStore.Images.Media.BUCKET_DISPLAY_NAME }; 

     cursor = activity.getContentResolver().query(uri, projection, null, 
       null, null); 

     column_index_data = cursor.getColumnIndexOrThrow(MediaColumns.DATA); 

     column_index_folder_name = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME); 

     while (cursor.moveToNext()) { 

      absolutePathOfImage = cursor.getString(column_index_data); 

      folderName = cursor.getString(column_index_folder_name); 

      ImageDataModel imDataModel = new ImageDataModel(folderName, 
        absolutePathOfImage); 

      if (imageFolderMap.containsKey(folderName)) { 

       imageFolderMap.get(folderName).add(imDataModel); 

      } else { 

       ArrayList<ImageDataModel> listOfAllImages = new ArrayList<ImageDataModel>(); 

       listOfAllImages.add(imDataModel); 

       imageFolderMap.put(folderName, listOfAllImages); 
      } 
     } 

     // Get all Internal images 
     uri = android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI; 

     cursor = activity.getContentResolver().query(uri, projection, null, 
       null, null); 

     column_index_data = cursor.getColumnIndexOrThrow(MediaColumns.DATA); 

     column_index_folder_name = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME); 

     while (cursor.moveToNext()) { 

      absolutePathOfImage = cursor.getString(column_index_data); 

      folderName = cursor.getString(column_index_folder_name); 

      ImageDataModel imDataModel = new ImageDataModel(folderName, 
        absolutePathOfImage); 

      if (imageFolderMap.containsKey(folderName)) { 

       imageFolderMap.get(folderName).add(imDataModel); 
      } else { 

       ArrayList<ImageDataModel> listOfAllImages = new ArrayList<ImageDataModel>(); 

       listOfAllImages.add(imDataModel); 

       imageFolderMap.put(folderName, listOfAllImages); 
      } 

     } 

     keyList = new ArrayList(imageFolderMap.keySet()); 

     return imageFolderMap; 
    } 

創建自定義插件: - 您可以在科爾多瓦插件合併該功能

 /* 
     * 
     * This Cordova plugin help to fetch all folders with images 
     */ 

     public class ImageGalleryPlugin extends CordovaPlugin { 

      priva 

te static final String FETCH_ALL_IMAGES_ACTION = "fetchAllImages"; 
     private CallbackContext mCallbackContext; 

     @Override 
     public boolean execute(String action, CordovaArgs args, CallbackContext callbackContext) { 

      this.mCallbackContext = callbackContext; 

      if (FETCH_ALL_IMAGES_ACTION.equals(action)) { 

       cordova.getThreadPool().execute(new Runnable() { 
        public void run() { 

         mCallbackContext.success(new JSONObject(getImageFolderMap(cordova.getActivity()))); 

        } 
       }); 

       return true; 
      } 
      return false; 

     } 

     /* 
     * Returns an Map of image folder with key = "folder name" and value = 
     * "List Of Images in that Folder" 
     * 
     * Retrieve image from folder Map by 
     * 
     * 1) fetching all folder keys from Map :- 
     * 
     * ArrayList<String> folderKeyList = new ArrayList(imageFolderMap.keySet()); 
     * 
     * 2) Retrive images in a folder by its index in folderKeyMap 
     * 
     * ArrayList<ImageDataModel> imageList = 
     * imageFolderMap.get(folderKeyList.get(indexOfFolder)) ; 
     * 
     */ 
     public static Map<String, ArrayList<ImageDataModel>> getImageFolderMap(Activity activity) { 

      String folderNameKey; 

      // Map to store list of images with folder name as Key Value 
      Map<String, ArrayList<ImageDataModel>> imageFolderMap = new HashMap<String, ArrayList<ImageDataModel>>(); 

      // Clear Map to avoid duplication of images 
      imageFolderMap.clear(); 

      int columnIndexData, columnIndexFolderName, columnIndexImageName; 

      // GET ALL EXTERNAL STORAGE IMAGES 
      Uri uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 

      // Query image path,name and folder name 
      String[] projection = { MediaColumns.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME, 
        MediaStore.Images.Media.DISPLAY_NAME }; 

      Cursor cursor = activity.getContentResolver().query(uri, projection, null, null, null); 

      columnIndexImageName = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME); 

      columnIndexData = cursor.getColumnIndexOrThrow(MediaColumns.DATA); 

      columnIndexFolderName = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME); 

      // Iterate over all cursor data 
      while (cursor.moveToNext()) { 

       // Get folder Name of image 
       folderNameKey = cursor.getString(columnIndexFolderName); 

       // Fill data in image data Model 
       ImageDataModel imDataModel = new ImageDataModel(
         cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME)), 
         cursor.getString(columnIndexFolderName), cursor.getString(columnIndexData)); 

       // If folder is already added in Map 
       if (imageFolderMap.containsKey(folderNameKey)) { 

        // Add Image into Existing Arraylist of images in Map 
        imageFolderMap.get(folderNameKey).add(imDataModel); 

       } else { 

        // If folder was not added add image into array list with folder 
        // name as key 
        ArrayList<ImageDataModel> listOfAllImages = new ArrayList<ImageDataModel>(); 

        // Add image into array list 
        listOfAllImages.add(imDataModel); 

        // put array list into map with folder name 
        imageFolderMap.put(folderNameKey, listOfAllImages); 
       } 
      } 

      // GET ALL INTERNALK STORAGE IMAGES 
      uri = android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI; 

      // Query image path,name and folder name 
      cursor = activity.getContentResolver().query(uri, projection, null, null, null); 

      while (cursor.moveToNext()) { 

       folderNameKey = cursor.getString(columnIndexFolderName); 

       ImageDataModel imDataModel = new ImageDataModel(cursor.getString(columnIndexImageName), 
         cursor.getString(columnIndexFolderName), cursor.getString(columnIndexData)); 

       // If folder is already added in Map 
       if (imageFolderMap.containsKey(folderNameKey)) { 

        // Add image to Arraylist 
        imageFolderMap.get(folderNameKey).add(imDataModel); 
       } else { 

        ArrayList<ImageDataModel> listOfImagesInFolder = new ArrayList<ImageDataModel>(); 

        listOfImagesInFolder.add(imDataModel); 

        imageFolderMap.put(folderNameKey, listOfImagesInFolder); 
       } 

      } 

      return imageFolderMap; 
     } 

    } 

ADD模型類來保存數據

Public class ImageDataModel { 

    private String imageTitle, imagePath, imageFolder; 

    public String getImageFolder() { 
     return imageFolder; 
    } 

    public void setImageFolder(String imageFolder) { 
     this.imageFolder = imageFolder; 
    } 

    /** 
    * @return the imageTitle 
    */ 
    public String getImageTitle() { 
     return imageTitle; 
    } 

    /** 
    * @param imageTitle 
    *   the imageTitle to set 
    */ 
    public void setImageTitle(String imageTitle) { 
     this.imageTitle = imageTitle; 
    } 

    /** 
    * @return the imagePath 
    */ 
    public String getImagePath() { 
     return imagePath; 
    } 

    /** 
    * @param imagePath 
    *   the imagePath to set 
    */ 
    public void setImagePath(String imagePath) { 
     this.imagePath = imagePath; 
    } 

    public ImageDataModel(String imageTitle, String imageFolder, String absolutePathOfImage) { 
     this.imageTitle = imageTitle; 
     this.imageFolder = imageFolder; 
     this.imagePath = absolutePathOfImage; 
    } 

} 
  • 用法: -然後,您可以使用這個插件是這樣的

getAllImages: function(success,error,args){ 'use strict'; cordova.exec(success,error, "ImageGalleryPlugin", "fetchAllImages", args); },

+0

生成失敗; 'java:67:error:鑽石運算符不支持-source 1.6 Map > imageFolderMap = new HashMap <>(); (使用源7或更高來啓用鑽石算子)' 我不知道Java,我該怎麼辦? –

+0

您可以將Java編譯器更改爲Java 1.7或替換Map > imageFolderMap = new HashMap <>(); 與\t \t Map > imageFolderMap = new HashMap >(); 請參閱編輯科爾多瓦插件(第17行) –

+0

好吧修好了,真的很感謝你!我的最後一個問題是否有機會從這些代碼中獲取縮略圖? –

0

你的問題可以劃分成兩個子問題

問題1: - SD卡上得到的所有圖像

解決方案: -做一個科爾多瓦插件或在現有的插件之一嵌入此方法。通過使用你自定義的cordova插件動作(比如說fetchAllImages)來調用這個方法,它會返回sd卡中所有圖像的路徑。她是一個科爾多瓦插件,我已經我沒有測試它可以正常工作,否則你會得到一個想法: -

import java.util.ArrayList; 

import org.apache.cordova.CallbackContext; 
import org.apache.cordova.CordovaArgs; 
import org.apache.cordova.CordovaPlugin; 
import org.json.JSONArray; 
import org.json.JSONException; 

import android.app.Activity; 
import android.database.Cursor; 
import android.net.Uri; 
import android.provider.MediaStore; 
import android.provider.MediaStore.MediaColumns; 

public class GalleryPlugin extends CordovaPlugin { 

    private static final String ACTION_GET_ALL_IMAGES = "getAllImages"; 

    @Override 
    public boolean execute(String action, CordovaArgs args, 
      final CallbackContext callbackContext) throws JSONException { 
     try { 

      // if action is getAllImages 
      if (ACTION_GET_ALL_IMAGES.equals(action)) { 

       // DO operation in thread pool to avoid cordova thread blocking 
       cordova.getThreadPool().equals(new Runnable() { 
        public void run() { 

         // Return list of images in JSON Array 
         callbackContext.success(new JSONArray(
           getAllShownImagesPath(cordova.getActivity()))); 

        } 
       }); 

      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return false; 
     } 

     return super.execute(action, args, callbackContext); 
    } 

    /** 
    * Getting All Images Path. 
    * 
    * @param activity 
    *   the activity 
    * @return ArrayList with images Path 
    */ 
    private ArrayList<String> getAllShownImagesPath(Activity activity) { 
     Uri uri; 
     Cursor cursor; 
     int column_index_data, column_index_folder_name; 
     ArrayList<String> listOfAllImages = new ArrayList<String>(); 
     String absolutePathOfImage = null; 
     uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 

     String[] projection = { MediaColumns.DATA, 
       MediaStore.Images.Media.BUCKET_DISPLAY_NAME }; 

     cursor = activity.getContentResolver().query(uri, projection, null, 
       null, null); 

     column_index_data = cursor.getColumnIndexOrThrow(MediaColumns.DATA); 
     column_index_folder_name = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME); 
     while (cursor.moveToNext()) { 
      absolutePathOfImage = cursor.getString(column_index_data); 

      listOfAllImages.add(absolutePathOfImage); 
     } 
     return listOfAllImages; 
    } 
} 

問題2: -現在你已經在JS端的所有圖片的路徑,你需要顯示科爾多瓦web視圖圖像

解決方案: -你可以參考這篇文章Load the image saved in sdcard in webview

備選: -You can implement your own gallery app並將其嵌入到您的cordova應用程序中。

+0

我需要設備上的所有圖片(如Android Gallery應用中的「所有圖片」文件夾)不僅SD卡 http://s31.postimg.org/d1fbj32t7/emulator.png –

+0

添加新的答案 –