带有相机应用的Android App-弹出菜单

时间:2017-01-30 17:21:54

标签: java android android-intent webview android-camera

我一直试图让我的第一个Android应用程序正常运行。我有一个使用webview的活动,我用它来打开上面有html表单的网页。

在“选择文件”按钮(用于文件输入)工作时遇到了一些问题,但由于此处File Upload in WebView发布的帮助,我终于解决了这个问题。 从那里开始,我几乎使用了他们在Github上提供的Main Activity java code

我的实际问题是,当点击文件输入按钮时,我没有让用户选择使用我想要的设备的相机。起初我认为这可能与为应用程序请求相机权限有关,但我实现了它,我错了。这里的问题是我对 Intents 没有经验来获取弹出菜单,例如:

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

关于找到获得“相机”选项的方法的一些指导将非常感激。

让我向您展示我的意思,在Chrome上打开相同的html表单,在2个不同的Android操作系统版本(4.4.4和6.0)上打开我的应用程序。使用我的三星Galaxy Tab,运行 Android 4.4.4。打开具有html表单的网页时,在Google Chrome 上,点击选择文件按钮,I get this menu

这就是我想要的应用

使用相同的网址并在我的应用中显示(在4.4.4上),使用我的网页视图,点击选择文件按钮,{{3} }

(另外,我已尝试点击选择文件按钮<我的应用上的,在Android 6.0模拟器上I get this menu,并且那里没有相机选项):

这是代码的相关部分:

        //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;
        }

3 个答案:

答案 0 :(得分: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处理程序中从摄像头获取的图片。

希望这有帮助!

答案 1 :(得分:0)

this answer Mario Velasco是否可以帮助您。

答案 2 :(得分:0)

好的,所以我在此期间已经找到了部分问题。

我在清单中说明了所需的权限,例如:

s3-pit-restore --bucket my-bucket --dest my-restored-bucket --timestamp "06-17-2016 23:59:50 +2"

但是,由于没有明确要求访问设备的相机和存储设备,我犯了一个错误的错误,如:

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

适用于Android 5.0+的部分可以使用(代码可以开始使用),还有一个菜单,您可以在其中选择相机或图库中的图片。

无论哪种方式,我都测试过用户CSmith对5.0+的建议,并确认它也有效,所以如果有人碰到这个,那么你可以尝试它是一个可行的选择。

对于5岁以上的Android版本,我设法点击了&#34;选择文件&#34; (但没有图库选项)按钮打开相机应用程序并进行一些更改,如下所示:

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);
        }
    }

我正在使用这个&#34;修复&#34;对于3和4,现在。