2016-09-08 9 views
4

私はcordovaとangularjsを使用して作成されたハイブリッドアプリをAndroid用に使用しています。Crosswalk Cordova Android複数のファイルを選択

私は、複数のファイルを選択できるように、html5ファイル入力用のソリューションを見つけるためにインターネットを精査してきました。

私は、ファイルを選択するための次の要素を使用しています:私は、Androidロリポップバージョン5.1.1と横断歩道のバージョン20を実行しています

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

、私はまた、横断歩道のバージョン18と19でテストしてきました。 Chromeは最新のバージョンを搭載した端末にインストールされていますが、違いはありません。

上記の入力要素をクリックすると、ドキュメントまたはカメラの選択を求めるダイアログが表示されます。私が自分のドキュメントから選択すると、単一のファイル(この場合はイメージ)しか選択できません。これは、私が画像を選択できるすべてのアプリケーションに当てはまるので、デフォルトのアンドロイドの「Images」、「Videos」、「Audio」など、Googleフォトなどの外部アプリ - 一度に1つのファイルしか選択できない。

以下の画像では、ファイルが一覧表示されていますが、各タイルを長押しすると複数選択にファイルが追加されません。

enter image description here

これは、AppのIOSのバージョンで動作します。

オンラインで見つけたすべての資料を掘り下げた後、複数の属性がChrome 5以降でAndroid 5以上でサポートされているようです。

これはクロスウォークブラウザの実装か、Androidオペレーティングシステムの問題なのかどうかわかりません。誰も助言することができます。

編集ただ、これはとか、横断歩道を使用しなくても動作しません確認します。

+0

同じ問題。バグレポート@クロスウォークプロジェクトを作成しました:https://crosswalk-project.org/jira/browse/XWALK-7352 –

+0

これに関する更新は何ですか? –

答えて

2

これを整理しようとした数週間後、私はついにそれを働かせました(クロスウォークのないコルドバ)。これはWindowsのCordova Toolsを使用して行われていますので、以下のfilespecsをご容赦ください。

ステップ1:21 にアンドロイド\ CordovaLib \のAndroidManifest.xml \プラットフォームでminSdkVersionが変更説明:LOLLIPOP(API 21)にonShowFileChooser APIを導入しました。以前のAPIバージョンでurlの代わりにが返され、showFileChooserが返されます。これは、APIを21以上に変更した場合にのみ呼び出されます。

手順2:onActivityResultメソッドを更新/置き換えて複数のファイルを取得します。 は、複数のファイルを選択できるようにfileChooserParamsを使って意思を作成した後に、次を追加します。

intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); 

場所:アンドロイド\ CordovaLib \ SRC \ orgの\ apacheの\コルドバ\エンジン\のSystemWebChromeClient \プラットフォーム。java

手順3:対応するonActivityResultメソッドを更新し、intent.getClipData()を使用して複数のURLを返します。

警告:

  1. は、すべてのコールのためのマルチアップロードを可能にします。 fileChooserParamsモードに基づいてインテントを更新することができます。
  2. デフォルトで横断歩道で利用可能なチューザ内のソースとしてカメラを無効にします。

最終的なコード:ここ

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

これは依然として好ましい方法ですか? – Thomas

+0

理想的には、これはCordovaで修正する必要がありますが、私はそうすることの仕組みにあまり慣れていません。したがって、テストを含む次のリリースでこれを解決するために誰かがボランティアできるならば、これは皆に役立つでしょう。 – RIBH

関連する問題