Cordova Android - 从设备获取所有图片 [英] Cordova Android - Getting all images from the device

查看:145
本文介绍了Cordova Android - 从设备获取所有图片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我想在Cordova 6.1.1上创建一个图库应用程序



我需要从设备获取所有图片



我在应用程式的iOS版本中使用「File」和「AssetsLib」外挂程式进行了这项操作。





函数 返回图片文件夹的映射,文件夹名称为,图片的ArrayList为 b
$ b

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

imageFolderMap.clear();

Uri uri;
光标光标;
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);
}
}

//获取所有内部映像
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;
}

创建自定义插件: - 函数在Cordova插件

  / * 
*
*此Cordova插件帮助获取所有文件夹
* /

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;

}

/ *
*返回包含key =folder name和value =
*的图像文件夹的映射那个文件夹
*
*从文件夹中检索图片Map by
*
* 1)从地图中获取所有文件夹键: -
*
* ArrayList< ; String> folderKeyList = new ArrayList(imageFolderMap.keySet());
*
* 2)通过其在folderKeyMap中的索引在文件夹中找回图像
*
* ArrayList< ImageDataModel> imageList =
* imageFolderMap.get(folderKeyList.get(indexOfFolder));
*
* /
public static Map< String,ArrayList< ImageDataModel> getImageFolderMap(Activity activity){

String folderNameKey;

//映射到存储文件夹名为键值的图像列表
Map< String,ArrayList< ImageDataModel> imageFolderMap = new HashMap< String,ArrayList< ImageDataModel>>();

//清除地图以避免图像重复
imageFolderMap.clear();

int columnIndexData,columnIndexFolderName,columnIndexImageName;

//获取所有外部存储映像
Uri uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

//查询图像路径,名称和文件夹名称
String [] projection = {MediaColumns.DATA,MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.Images.Media。显示名称 };

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

//迭代所有游标数据
while(cursor.moveToNext()){

//获取文件夹图像名称
folderNameKey = cursor .getString(columnIndexFolderName);

//在图像数据中填充数据模型
ImageDataModel imDataModel = new ImageDataModel(
cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME)),
cursor.getString(columnIndexFolderName),cursor.getString(columnIndexData));

//如果文件夹已经在Map中添加
if(imageFolderMap.containsKey(folderNameKey)){

//将图像添加到Map中的图像的现有列表中
imageFolderMap.get(folderNameKey).add(imDataModel);

} else {

//如果没有添加文件夹,将图像添加到数组列表中,文件夹为
// name as key
ArrayList< ImageDataModel> listOfAllImages = new ArrayList< ImageDataModel>();

//将图像添加到数组列表
listOfAllImages.add(imDataModel);

//将数组列表放入地图文件夹名称
imageFolderMap.put(folderNameKey,listOfAllImages);
}
}

//获取所有内部存储映像
uri = android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI;

//查询图像路径,名称和文件夹名称
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));

//如果文件夹已经添加到Map
if(imageFolderMap.containsKey(folderNameKey)){

//将图像添加到Arraylist
imageFolderMap .get(folderNameKey).add(imDataModel);
} else {

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

listOfImagesInFolder.add(imDataModel);

imageFolderMap.put(folderNameKey,listOfImagesInFolder);
}

}

return imageFolderMap;
}

}

添加模型类保存数据

 公共类ImageDataModel {

私有字符串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
* imageTitle设置
* /
public void setImageTitle(String imageTitle) {
this.imageTitle = imageTitle;
}

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

/ **
* @param imagePath
* imagePath设置
* /
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);
},



Hi I want to make a gallery APP on Cordova 6.1.1

and I need to get all images from the device

I did this on my app's iOS version with "File" and "AssetsLib" plugins

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

But I don't know how to do that on Android

解决方案

I have created an Android Gallery Project which fetch and display all Images and folders in a Grid View -

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

This function return Map of Image folders with folder name as Key and ArrayList of images as Value

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;
    }

Creating custom plugin :- You can merge this function in Cordova Plugin

      /*
         * 
         * 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 Model class to hold Data

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;
    }

}

  • Usage :- You can then use this plugin like this

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

这篇关于Cordova Android - 从设备获取所有图片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆