Конвертируйте типы MIME в fileChooserParams в правильный формат для Intent.setType - PullRequest
2 голосов
/ 01 апреля 2019

Я пытаюсь загрузить файл с помощью WebView в Android.

Это код используется:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onShowFileChooser(WebView webView, final ValueCallback<Uri[]> filePathsCallback, final WebChromeClient.FileChooserParams fileChooserParams) {
    Intent intent = fileChooserParams.createIntent();
    LOG.d(LOG_TAG, "mime types: " + Arrays.toString(fileChooserParams.getAcceptTypes()));
    // PRINTS [.jpg,.png,.tiff,.jpeg,.tif,.pdf] !!        
    try {
        parentEngine.cordova.startActivityForResult(new CordovaPlugin() {
            @Override
            public void onActivityResult(int requestCode, int resultCode, Intent intent) {
                // ...
            }
        }, intent, FILECHOOSER_RESULTCODE);
    } catch (ActivityNotFoundException e) {
      // ...
    }
    return true;
}

Проблема заключается в том, что когда внешняя библиотека, которую я должен использовать (ng-file-upload), запускает выполнение этого метода, типы MIME, передаваемые в качестве аргумента в fileChooserParams: [.jpg,.png,.tiff,.jpeg,.tif,.pdf].Я не вижу большинства из них в списке разрешенных типов пантомимы .

Как следствие я нахожу эту ошибку в LogCat: No activity found to handle file chooser intent.: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.GET_CONTENT cat=[android.intent.category.OPENABLE] typ=.jpg,.png,.tiff,.jpeg,.tif,.pdf }

Если я простодобавьте intent.setType("image/* application/pdf"); все работает как положено!

Теперь вопрос : в запросе на слияние , который я хочу отправить на cordova-android вкладчики, как мне безопасно преобразовать fileChooserParams в правильный формат?

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Я улучшил решение, используя этот код:

   // Validation utility for mime types
    private List<String> extractValidMimeTypes(String[] mimeTypes) {
        List<String> results = new ArrayList<String>();
        List<String> mimes;
        if (mimeTypes.length() == 1 && mimeTypes[0].contains(",")) {
            mimes = Arrays.asList(mimeTypes[0].split(","));
        } else {
            mimes = Arrays.asList(mimeTypes);
        }
        MimeTypeMap mtm = MimeTypeMap.getSingleton();
        for (String mime : mimes) {
            if (mime != null && mime.trim().startsWith(".")) {
                String extensionWithoutDot = mime.trim().substring(1, mime.trim().length());
                String derivedMime = mtm.getMimeTypeFromExtension(extensionWithoutDot);
                if (derivedMime != null && !results.contains(derivedMime)) {
                    // adds valid mime type derived from the file extension
                    results.add(derivedMime);
                }
            } else if (mtm.getExtensionFromMimeType(mime) != null && !results.contains(mime)) {
                // adds valid mime type checked agains file extensions mappings
                results.add(mime);
            }
        }
        return results;
    }


public boolean onShowFileChooser(WebView webView, final ValueCallback<Uri[]> filePathsCallback, final WebChromeClient.FileChooserParams fileChooserParams) {
    Intent intent = fileChooserParams.createIntent();
    List<String> validMimeTypes = extractValidMimeTypes(fileChooserParams.getAcceptTypes());
    if (validMimeTypes.isEmpty()) {
        intent.setType(DEFAULT_MIME_TYPE);
    } else {
        intent.setType(String.join(" ", validMimeTypes));
    }
    ...

См. Мой Запрос на извлечение для получения более подробной информации.

0 голосов
/ 01 апреля 2019

Я решил добавить следующие 2 строки в мой PR :

intent.setType("image/*");
intent.putExtra(Intent.EXTRA_MIME_TYPES, fileChooserParams.getAcceptTypes());

Результат:

2019-04-01 00:18:00.501 32500-32500/my.app.bundle.id D/SystemWebChromeClient: : fileChooserParams.getAcceptTypes(): [.jpg,.png,.tiff,.jpeg,.tif,.pdf]

2019-04-01 00:18:00.503 2225-2921/system_process I/ActivityManager: START u0 {act=android.intent.action.GET_CONTENT cat=[android.intent.category.OPENABLE] typ=image/* cmp=com.android.documentsui/.picker.PickActivity (has extras)} from uid 10105

Я надеюсь, что это будет принято.

...