2017-01-30 5 views
0

Я пытался заставить мое первое приложение для Android работать. У меня есть одно действие, которое использует веб-просмотр, и я использую его для открытия веб-страниц, на которых есть html-формы.Android App-Popup Menu с камерой App

Была проблема с тем, что кнопка «Выбрать файл» (для файловых входов) работала, но я, наконец, решил ее благодаря помощи, размещенной здесь File Upload in WebView. Оттуда, я в значительной степени использую Main Activity java code, которые они сделали доступными на Github.

Моя фактическая проблема заключается в том, что при нажатии кнопки ввода файла у меня нет возможности использовать камеру, которую я хотел бы иметь. Сначала я подумал, что это может быть связано с необходимостью разрешения камеры для приложения, но я ее реализовал, и я ошибся в этом. Проблема здесь в том, что я неопытный с для намерений получить всплывающее меню, как:

Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
i.addCategory(Intent.CATEGORY_OPENABLE); 
i.setType("image/*"); 

Некоторых рекомендации по найти способ, чтобы получить опцию «Камера», чтобы придумать буду высоко ценятся.

Позвольте мне показать вам, что я имею в виду, открывая ту же самую html-форму в Chrome и мое приложение на двух разных версиях ОС Android (4.4.4 и 6.0). Использование моей вкладки Samsung Galaxy, работающей под управлением Android 4.4.4. При открытии страницы, которая имеет форму HTML, на Google Chrome, нажав Выбрать файл кнопку , I get this menu

Это то, что я хочу, чтобы в моем приложении

адресности, используя тот же URL и отображаются его в моем приложении (на 4.4.4), используя мой WebView, при нажатии на Выбрать кнопку Файл, I get this menu

(Кроме того, я попытался щелчки, что Выберите кнопку Файл на мое приложение, на Android 6.0 эмуль АТОР, and it goes straight to the gallery, и нет никакой возможности камеры есть):

Это соответствующая часть кода:

 //For Android 4.1+ 
     public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){ 
      mUM = uploadMsg; 
      Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
      i.addCategory(Intent.CATEGORY_OPENABLE); 
      i.setType("image/*"); 
      MainActivity.this.startActivityForResult(Intent.createChooser(i, "Choose an Image please"), MainActivity.FCR); 
     } 
     //For Android 5.0+ 
     public boolean onShowFileChooser(
       WebView webView, ValueCallback<Uri[]> filePathCallback, 
       FileChooserParams fileChooserParams){ 
      if(mUMA != null){ 
       mUMA.onReceiveValue(null); 
      } 
      mUMA = filePathCallback; 
      Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      if(takePictureIntent.resolveActivity(MainActivity.this.getPackageManager()) != null){ 
       File photoFile = null; 
       try{ 
        photoFile = createImageFile(); 
        takePictureIntent.putExtra("PhotoPath", mCM); 
       }catch(IOException ex){ 
        Log.e(TAG, "Image file creation failed", ex); 
       } 
       if(photoFile != null){ 
        mCM = "file:" + photoFile.getAbsolutePath(); 
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
       }else{ 
        takePictureIntent = null; 
       } 
      } 
      Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT); 
      contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE); 
      contentSelectionIntent.setType("image/*"); 
      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, "Image Chooser"); 
      chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray); 
      startActivityForResult(chooserIntent, FCR); 
      return true; 
     } 

ответ

0

Хорошо, поэтому я выяснил часть проблемы в то же время.

я изложил необходимые разрешения в манифесте, как:

<uses-permission android:name="android.permission.CAMERA"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

Но я сделал Начинающую ошибку, не задавая явно для доступа к камере и хранению устройства, как:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1); 
     } 
    } 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
     } 
    } 

Часть для Android 5.0+ работает (код был в порядке, чтобы начать), и есть меню, в котором вы можете выбирать между камерой или фотографиями из галереи.

В любом случае, я также опробовал предложение пользователя CSmith на 5.0+ и подтвердил, что он также работает, поэтому, если кто-нибудь когда-нибудь столкнется с этим, это жизнеспособная альтернатива, которую вы можете попробовать.

Для Android версий старше 5 лет, я сумел сделать, нажав кнопку «Выбрать файл» (но не галерея опция) кнопка не открыть приложение камеры с некоторыми изменениями, например:

public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){ 
      mUM = uploadMsg; 
      Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      startActivityForResult(i, 1); 
     } 

И я «Использую это« исправить »для 3 и 4, пока.

1

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

private Intent getPhotoChooserIntent(String acceptType, String capture) 
{ 
try 
{ 
    //--------------------------------------------------------------------- 
    // camera Intent 
    //--------------------------------------------------------------------- 
    Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    Calendar cal = Calendar.getInstance(); 
    SimpleDateFormat sdf = new SimpleDateFormat("HHmmss", Locale.US); 

    // path to picture 
    File dirPhotos = mContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
    File photo = new File(String.format("%s/Photo_%s.jpg", dirPhotos.getAbsolutePath(), sdf.format(cal.getTime()))); 
    mPhoto = Uri.fromFile(photo); 
    intentCamera.putExtra (MediaStore.EXTRA_OUTPUT, mPhoto); 

    // pass "camera" in this parameter for a Camera only picker 
    if (capture.equalsIgnoreCase("camera")) 
    { 
    if (intentCamera.resolveActivity(mContext.getPackageManager()) != null) 
     return (intentCamera); 
    return (null); 
    } 

    //--------------------------------------------------------------------- 
    // media picker Intent 
    //--------------------------------------------------------------------- 
    Intent intentPicker = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

    // aggregate list of resolved intents 
    List<Intent> intentsList = new ArrayList<>(); 

    List<ResolveInfo> resInfo = mContext.getPackageManager().queryIntentActivities(intentPicker, 0); 
    for (ResolveInfo resolveInfo : resInfo) 
    { 
    Intent intentTarget = new Intent(intentPicker); 
    intentTarget.setPackage(resolveInfo.activityInfo.packageName); 
    intentsList.add(intentTarget); 
    } 

    if (intentCamera.resolveActivity(mContext.getPackageManager()) != null) 
    intentsList.add(intentCamera); 

    if (intentsList.size() > 0) 
    { 
    Intent intentChooser = Intent.createChooser(intentsList.remove(intentsList.size() - 1), mContext.getResources().getString(R.string.mediapicker)); 
    intentChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentsList.toArray(new Parcelable[]{})); 
    return (intentChooser); 
    } 
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
} 
return (null); 
} 

Предполагает mContext = контекст деятельности. mPhoto - это переменная класса типа Uri, используемая для доступа к снимку, полученному с камеры, в обработчике onActivityResult.

Надеюсь, это поможет!

Смежные вопросы