2016-04-23 6 views
0

Hallo ich eine Galerie APP auf Cordova 6.1.1Cordova Android - Erste alle Bilder aus dem Gerät

machen will und ich brauche alle Bilder aus dem Gerät

ich das iOS auf meiner App tat zu bekommen Version mit "Datei" und "AssetsLib" plugins

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

Aber ich weiß nicht, wie die

+0

Schauen Sie sich dieses Plugin an: [cordova-plugin-imagepicker] (https://www.npmjs.com/package/cordova-plugin-imagepicker).Unterstützt sowohl Android als auch iOS – utamanna

+0

Nein Ich möchte nicht, dass Benutzer Bilder auswählen, ich will sie alle ihre Bilder auf dem Bildschirm sehen –

Antwort

0

Ich habe erstellt ein Android Gallery Project, die holen und zeigen alle Bilder und Ordner in einem Grid View -

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

enter image description here

Diese function return Karte von Bild Ordner mit Ordnernamen als Key und ArrayList von Bildern wie Wert

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

Erstellen von benutzerdefinierten Plugin: - Sie können diese Funktion in Cordova Plugin fusionieren

 /* 
     * 
     * 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 Modellklasse zu Daten halten

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

} 
  • Verbrauch: - Sie können dann mit Dieses Plugin wie dieses

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

+0

Build fehlgeschlagen; 'Java: 67: Fehler: Diamant-Operator wird nicht unterstützt in -source 1.6 Karte > imageFolderMap = neue HashMap <>(); (benutze -source 7 oder höher, um den Diamant-Operator zu aktivieren) ' Ich weiß Java nicht, was soll ich tun? –

+0

Sie können den Java-Compiler in Java 1.7 ändern oder Map ersetzen > imageFolderMap = new HashMap <>(); mit \t \t Map > imageFolderMap = new HashMap >(); siehe bearbeiten in Cordova Plugin (Line # 17) –

+0

ok behoben, wirklich danke! meine letzte Frage, gibt es eine Chance, Thumbnails von diesen Codes zu bekommen? –

0

Ihr Problem auf Android zu tun teilen sich in zwei Unter Problem sein kann

Problem 1: - alle Bilder auf SD-Karte erhalten

Lösung: - ein cordova Plugin Stellen oder diese Methode in einem der vorhandenen Plugins einbinden. Rufen Sie diese Methode auf, indem Sie Ihre benutzerdefinierte cordova-Plugin-Aktion verwenden (sagen wir fetchAllImages), es wird den Pfad aller Bilder auf der SD-Karte zurückgeben. Hers ist ein cordova Plugin ich gemacht habe, habe ich nicht getestet es funktionieren kann, oder Sie werden eine Vorstellung bekommen: -

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

Problem 2: - Jetzt haben Sie alle Bildpfad in js Seite, Sie müssen angezeigt werden Bilder in cordova webView

Lösung: - Sie diesen Beitrag Load the image saved in sdcard in webview

Alternative verweisen: -You can implement your own gallery app und bette es in deine cordova App ein.

+0

Ich brauche alle Bilder auf dem Gerät (wie "Alle Bilder" Ordner in Android Gallery App) nicht nur SD-Karte http://s31.postimg.org/d1fbj32t7/emulator.png –

+0

Neue Antwort hinzugefügt –

Verwandte Themen