2016-09-08 2 views
4

J'ai une application hybride construite en utilisant cordova et angularjs, pour Android, je lance l'application en utilisant un passage pour piétons.Crosswalk Cordova Android fichier multiple sélectionnez

J'ai parcouru Internet pour trouver la solution pour l'entrée du fichier html5 pour permettre la sélection de plusieurs fichiers.

J'utilise l'élément suivant pour la sélection de fichier:

<input type="file" multiple="multiple" name="files[]" /> 

Je courais version Android Lollipop 5.1.1 et la version Crosswalk 20, je l'ai testé avec la version Crosswalk 18 et 19 également. Chrome est installé sur mon appareil exécutant la dernière version bien que je ne pense pas que cela fasse une différence.

Lorsque je clique sur l'élément d'entrée ci-dessus, j'obtiens la boîte de dialogue attendue me demandant de sélectionner dans Mes Documents ou Appareil photo. Si je choisis de sélectionner dans Mes Documents, je ne peux sélectionner que des fichiers uniques, dans ce cas des images. Cela est vrai pour chaque application que je peux sélectionner des images, donc les 'Images', 'Vidéos', 'Audio', etc Android par défaut et les applications externes telles que Google Photos - Tous ne me permettent de sélectionner un seul fichier à la fois .

Dans l'image ci-dessous vous pouvez voir les fichiers listés, un appui long sur chaque carreau n'ajoute pas le fichier à une sélection multiple.

enter image description here

Cela fonctionne sur la version IOS de l'application. Après avoir exploré tout le matériel que je peux trouver en ligne, il semble que l'attribut multiple soit supporté sur Android 5+ sous Chrome 49+. Je ne sais pas s'il s'agit d'un problème de mise en œuvre d'un navigateur ou d'un système d'exploitation Android, ou autre chose? Quelqu'un pourrait-il conseiller.

Modifier

Juste pour confirmer cela ne fonctionne pas avec ou sans utiliser Crosswalk.

+0

Même problème ici. Fait un bugreport @ le projet de crosswalk: https://crosswalk-project.org/jira/browse/XWALK-7352 –

+0

Toute mise à jour sur ce ?? –

Répondre

2

Après des semaines d'essayer de régler ce problème, je l'ai finalement obtenu de travailler (Cordova sans Crosswalk). Cela a été fait en utilisant Cordova Tools dans Windows alors s'il vous plaît pardonnez les filespecs ci-dessous.

Étape 1: Changer le minSdkVersion dans les plates-formes Android \ \ CordovaLib \ AndroidManifest.xml à 21 Explication: API onShowFileChooser a été introduit dans LUCETTE (API 21). Il permet le retour url[] au lieu de url retourné par showFileChooser dans les versions antérieures de l'API. Ceci n'est appelé que lorsque vous modifiez l'API à 21 ou plus.

Étape 2: Mettre à jour/Remplacer la méthode onActivityResult pour récupérer plusieurs fichiers. Append, après la création d'intention à l'aide fileChooserParams pour permettre la sélection de plusieurs fichiers:

intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); 

Lieu: plates-formes \ android \ CordovaLib \ src \ org \ apache \ cordova \ moteur \ SystemWebChromeClient.java

Étape 3: Mettez à jour la méthode onActivityResult correspondante pour renvoyer plusieurs URL à l'aide de intent.getClipData().

Avertissements:

  1. Active Multi-téléchargement pour tous les appels. Vous pouvez mettre à jour l'intention en fonction du mode fileChooserParams.
  2. Désactive la caméra en tant que source dans le sélecteur qui est disponible avec le crosswalk par défaut.

code final:

Uri photoUri; 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
@Override 
public boolean onShowFileChooser(WebView webView, final ValueCallback<Uri[]> filePathsCallback, final WebChromeClient.FileChooserParams fileChooserParams) { 
    // Check and use MIME Type. 
    String mimeType = "*/*"; 
    int ACTION_CODE = FILECHOOSER_RESULTCODE; 
    try { 
     if (fileChooserParams.getAcceptTypes().length > 0) { 
      mimeType = fileChooserParams.getAcceptTypes()[0]; 
     } else { 
      mimeType = "*/*"; 
     } 
    } catch (Exception e) { 
     mimeType = "*/*"; 
    }; 

    // Check if Mutiple is specified 
    Boolean selectMultiple = false; 
    if (fileChooserParams.getMode() == WebChromeClient.FileChooserParams.MODE_OPEN_MULTIPLE) { 
     selectMultiple = true; 
    }; 

    Intent intent = new Intent(); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 
    if (selectMultiple) { intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); }; 
    intent.setType(mimeType); 
    ACTION_CODE = FILECHOOSER_RESULTCODE; 
    final Intent chooserIntent = Intent.createChooser(intent, "Select Source"); 

    // Add camera intent to the chooser if image and send URI to return full image 
    if (mimeType.equals("image/*")) { 
     photoUri = null; 
     try { 
      File photoFile = createImageFile(); 
      photoUri = Uri.fromFile(photoFile); 
     } 
     catch (Exception ex) { 
      photoUri = null; 
     } 
     if (photoUri != null) { 
      Intent camIntent = new Intent(); 
      camIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); 
      camIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); 
      camIntent.putExtra("return-data", true); 
      chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent [] {camIntent}); 
     } 
    } 

    try { 
     parentEngine.cordova.startActivityForResult(new CordovaPlugin() { 
      @Override 
      public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
       if (resultCode == Activity.RESULT_OK && intent != null) { 
        if (intent.getData() != null) 
        { 
         Uri[] result = WebChromeClient.FileChooserParams.parseResult(resultCode, intent); 
         filePathsCallback.onReceiveValue(result); 
        } 
        else 
        { 
         if (intent.getClipData() != null) { 
          final int numSelectedFiles = intent.getClipData().getItemCount(); 
          Uri[] result = new Uri[numSelectedFiles]; 
          for (int i = 0; i < numSelectedFiles; i++) { 
           result[i] = intent.getClipData().getItemAt(i).getUri(); 
          } 
          filePathsCallback.onReceiveValue(result); 
         } 
         else { 
          filePathsCallback.onReceiveValue(null); 
         } 
        } 
       } 
       else if(resultCode == Activity.RESULT_OK && (intent == null || intent.getData() == null)) { 
        Uri[] result = new Uri[1]; 
        result[0] = photoUri; 
        filePathsCallback.onReceiveValue(result); 
       } else { 
        filePathsCallback.onReceiveValue(null); 
       } 
      } 
     }, chooserIntent, ACTION_CODE); 
    } catch (ActivityNotFoundException e) { 
     Log.w("No activity found to handle file chooser intent.", e); 
     filePathsCallback.onReceiveValue(null); 
    } 
    return true; 
} 
+0

est-ce toujours la méthode préférée? – Thomas

+0

Idéalement, cela devrait être corrigé dans Cordova, mais je ne suis pas très familier avec les mécanismes de le faire. Par conséquent, si quelqu'un pouvait faire du bénévolat pour que cela soit traité dans la prochaine version, y compris les tests, cela aiderait tout le monde. – RIBH