Выберите камеру в загрузке файла в приложении кордовы на андроид без использования камеры 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.
Ответы
Ответ 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, и у него есть пример кода, которым можно поделиться.