Подтвердить что ты не робот

Выберите камеру в загрузке файла в приложении кордовы на андроид без использования камеры cordova

Итак, я сделал приложение cordova, я добавил платформу Android и сделал простой html с полем imput

<input type="file" capture="camera" accept="image/*" id="takePictureField">

Я добавил

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<feature name="http://api.phonegap.com/1.0/camera" />

в файл манифеста.

но когда я нажимаю кнопку, я не могу выбрать новое изображение с камерой. есть ли какие-либо разрешения, которые я пропускаю, или что-нибудь еще?

Я не могу использовать функции коррекции кордоны, это нужно сделать в чистом html.

4b9b3361

Ответ 1

После небольшого поиска в Google, я могу сделать вывод:

Захват медиа в мобильных браузерах по-прежнему имеет некоторые проблемы. Проверьте эту ссылку. Отрывок говорит:

На самом деле, кажется, что текущие реализации вообще не полагаются на атрибут capture, а только на атрибуты type и accept: браузер отображает диалоговое окно, в котором пользователь может выбрать, где файл должен быть взят, а атрибут захвата не принимается во внимание Например, iOS Safari использует атрибут accept (не захватывать) для изображений и видео (не аудио). Даже если вы не используете атрибут accept, браузер позволит вам выбрать "Сделать фото или видео" и "Выбрать существующий".

Похоже, что атрибут захвата не оказывает никакого влияния.

Кроме того, предлагаем вам взглянуть на этот пост для получения дополнительной информации о создании этой работы. Надеюсь, поможет. Приветствия.

ОБНОВЛЕНИЕ: После понижения голоса, я копаю глубже в отношении проблемы. Большинство поисков не увенчались успехом, так как оптимальное решение для этой проблемы - использовать плагин камеры Cordova. Наконец, наткнулся на этот пост, который является точной копией этого вопроса. Пользователь смог решить эту проблему (хотя и с помощью веб-просмотра пешеходного перехода). Ответ в этом посте уже упоминается здесь @Fabio. Но вместо добавления плагина только для включения разрешений, вы можете использовать cordova-custom-plugin для добавления необходимых разрешений.

Кроме того, согласно комментарию @jcesarmobile (который является экспертом Cordova) в посте без плагина для просмотра веб-страниц, тип ввода отлично работает только на iOS, а не на Android. Поэтому использование плагина камеры - единственный способ заставить его работать без использования плагина crosswalk. Надеюсь, это поможет.

ОБНОВЛЕНИЕ 2: После обновленного вопроса я вырыл немного более глубоко для решения этой проблемы. Но теперь я могу заверить, что эта проблема все еще не решена для Android Webview. Похоже, это не проблема Cordova, а проблема с веб-представлением Chromium.

Для получения подробной информации просим вас ознакомиться с этими проблемами в Apache Cordova Issue Tracker:

Обе эти проблемы не решены до настоящего времени. Поэтому я уверен, что пока вы не сможете заставить его работать на Android, если не используете плагин камеры Cordova. Надеюсь, вы согласитесь со мной и примете решение. ура

Ответ 2

Отказ от ответственности: последние комментарии об этом ответе сообщают, что он больше не работает. Этот вопрос и ответы относятся к старым версиям Cordova и плагинов, поэтому они могут быть неприменимы к вашей текущей ситуации.

Старый вопрос, но я только столкнулся с этой проблемой. Оказывается, что самый простой способ добиться того, чего вы хотите, это включить эти плагины Cordova в ваше приложение, даже если вам не нужно их использовать.

cordova-plugin-camera
cordova-plugin-media-capture
cordova-plugin-device
cordova-plugin-file
cordova-plugin-media

С этими загруженными я обнаружил такое поведение

Нажав на

<input type="file" />

Прошу вас выбрать из камеры, видеокамеры, микрофона или документов

Нажав на

<input type="file" accept="image/*" />

Прошу вас выбрать из камеры или документов

Нажав на

<input type="file" accept="image/*" capture="capture" />

Сразу запустите камеру.

Ответ 3

Мой проект использовал cordova-plugin-inappbrowser.

Я решаю это, объединяя решение в веб-обзоре открытой камеры из поля ввода без filechooser с методами onActivityResult и onShowFileChooser из класса InAppBrowser в источнике плагина.

Смотрите изменения, сделанные в классе InAppBrowser в плагине версии 3.0.0

1 - включить импорт:

import android.app.Activity;
import android.Manifest;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

2 - объявить переменную:

    private String mCM;

3 - заменить код onShowFileChooser:


                    // For Android 5.0+
                    public boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams)
                    {
                        if(Build.VERSION.SDK_INT >=23 && (cordova.getActivity().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || cordova.getActivity().checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)) {
                            cordova.getActivity().requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, 1);
                        }

                        LOG.d(LOG_TAG, "File Chooser 5.0+");

                        // If callback exists, finish it.
                        if(mUploadCallbackLollipop != null) {
                            mUploadCallbackLollipop.onReceiveValue(null);
                        }
                        mUploadCallbackLollipop = filePathCallback;

                        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                        if(takePictureIntent.resolveActivity(cordova.getActivity().getPackageManager()) != null) {

                            File photoFile = null;
                            try{
                                photoFile = createImageFile();
                                takePictureIntent.putExtra("PhotoPath", mCM);
                            }catch(IOException ex){
                                Log.e(LOG_TAG, "Image file creation failed", ex);
                            }
                            if(photoFile != null){
                                mCM = "file:" + photoFile.getAbsolutePath();
                                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
                            }else{
                                takePictureIntent = null;
                            }
                        }
                        // Create File Chooser Intent
                        Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
                        contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
                        contentSelectionIntent.setType("*/*");
                        Intent[] intentArray;
                        if(takePictureIntent != null){
                            intentArray = new Intent[]{takePictureIntent};
                        }else{
                            intentArray = new Intent[0];
                        }

                        Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
                        chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
                        chooserIntent.putExtra(Intent.EXTRA_TITLE, "Selecione a imagem");
                        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);

                        // Run cordova startActivityForResult
                        cordova.startActivityForResult(InAppBrowser.this, chooserIntent, FILECHOOSER_REQUESTCODE);

                        return true;
                    }

4 - создать метод


    private File createImageFile() throws IOException{
        @SuppressLint("SimpleDateFormat") String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "img_"+timeStamp+"_";
        File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        return File.createTempFile(imageFileName,".jpg",storageDir);
    }

5 - заменить onActivityResult


    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        // For Android >= 5.0
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

            LOG.d(LOG_TAG, "onActivityResult (For Android >= 5.0)");

            Uri[] results = null;
            //Check if response is positive
            if(resultCode== Activity.RESULT_OK){
                if(requestCode == FILECHOOSER_REQUESTCODE){
                    if(null == mUploadCallbackLollipop){
                        return;
                    }
                    if(intent == null || intent.getData() == null){
                        //Capture Photo if no image available
                        if(mCM != null){
                            results = new Uri[]{Uri.parse(mCM)};
                        }
                    }else{
                        String dataString = intent.getDataString();
                        if(dataString != null){
                            results = new Uri[]{Uri.parse(dataString)};
                        }
                    }
                }
            }
            mUploadCallbackLollipop .onReceiveValue(results);
            mUploadCallbackLollipop = null;
        }
        // For Android < 5.0
        else {
            LOG.d(LOG_TAG, "onActivityResult (For Android < 5.0)");
            // If RequestCode or Callback is Invalid
            if(requestCode != FILECHOOSER_REQUESTCODE || mUploadCallback == null) {
                super.onActivityResult(requestCode, resultCode, intent);
                return;
            }

            if (null == mUploadCallback) return;
            Uri result = intent == null || resultCode != cordova.getActivity().RESULT_OK ? null : intent.getData();

            mUploadCallback.onReceiveValue(result);
            mUploadCallback = null;
        }
    }

Ответ 4

Здесь один крутой парень использует несколько новых тегов HTML для доступа к камере без функций PhoneGap, и у него есть пример кода, которым можно поделиться.