当前位置: 首页 > 知识库问答 >
问题:

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

傅胡媚
2023-03-14

我一直在努力让我的第一个Android应用程序工作。我有一个使用webview的活动,我用它来打开上面有html表单的网页。

让“选择文件”按钮(用于文件输入)工作有些困难,但多亏了这里发布的在网络视图中上传文件的帮助,我终于解决了这个问题。从那里,我基本上使用了他们在Github上提供的主活动java代码。

我的实际问题是,当点击一个文件输入按钮时,我没有让用户使用我想要的设备摄像头的选项。起初,我以为这可能与该应用程序需要获得摄像头许可有关,但我实现了它,但我错了。这里的问题是,我对获取弹出菜单的意图没有经验,比如:

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

如果您能提供一些关于如何找到“摄像头”选项的指导,我们将不胜感激。

让我告诉你我的意思,在Chrome上打开相同的html表单,在两个不同的Android操作系统版本(4.4.4和6.0)上打开我的应用程序。使用我的三星Galaxy标签,运行Android4.4.4。当打开一个包含html表单的页面时,在Google Chrome上,单击“选择文件”按钮,我会看到这个菜单

这就是我想在我的应用程序

使用相同的URL获取并在我的应用程序(4.4.4)中显示,使用我的webview,当单击“选择文件”按钮时,我会获得此菜单

(此外,我还试着在Android 6.0模拟器上点击我应用程序上的“选择文件”按钮,它会直接进入画廊,那里没有摄像头选项):

这是守则的相关部分:

        //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个答案

谭云瀚
2023-03-14

好的,我同时也解决了部分问题。

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

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

但是,我犯了一个begginer错误,没有明确要求访问设备的摄像头和存储器,如:

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

Android5.0的部分工作(代码一开始是可以的),还有一个菜单,你可以在相机或画廊的照片之间进行选择。

不管怎样,我也测试了用户CSmith对5.0的建议,并确认它也有效,所以如果有人遇到这种情况,你可以尝试一下。

对于5岁以上的Android版本,我已经设法让点击“选择文件”(但没有库选项)按钮打开相机应用程序,并做了一些更改,比如:

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使用这个“修复”。

高玮
2023-03-14

看看马里奥·贝拉斯科的回答是否对你有帮助。

东方旭东
2023-03-14

这是一个辅助功能,可以同时提供摄像头和媒体选择器。我想你是在特别询问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);
}

mPhoto是Uri类型的类变量,用于在onActivityResult处理程序中访问从相机获取的图片。

希望这有帮助!

 类似资料:
  • 训练 此处您将开始训练。打开 Training(训练)查看您储存在 Polar 应用程式中的运动内容列表。在此处您可以选择您想进行的运动项目。 您可以在 Polar Flow 应用程式或在 Polar Flow 网络服务中编辑您在 M600 的 Polar 应用程式中看到的所选运动内容。在移动应用程式菜单中,轻触 Sport profiles(运动内容)。或访问 flow.polar.com,单击

  • 问题内容: 我需要从Docker容器中在后台运行的Java应用程序中启动Selenium。启动失败,因为在运行时无法访问X11环境。请参阅下面的内容。 我该怎么办? 问题 我从安装Java 8和Jetty 9.3.x 的简单程序开始运行一个简单的服务(实际上是selenium的东西)。该服务实际上是为了启动一些需要UI才能执行的事情而设置的。我遇到的问题是其中的任何内容执行失败,因为UI在我运行的

  • Android应用程序有一个名为“Organization”的顶级菜单,点击省略号(3点)即可显示。 触摸此菜单时,弹出子菜单显示为组织。 我想把这个顶级菜单藏起来 和 在子弹出菜单中仅显示2项。 "注册组织"和"更改组织"是应用程序2子弹出菜单项。 我该怎么做?我试过下面的代码,但不起作用。 菜单xml

  • 我创建了一个android wear应用程序,并上传到play Store。当安装在手机上时,它不会自动在连接的android设备上安装wear应用程序(在本例中是Moto360)。我三次检查了android wear和android phone项目中的权限、应用程序id和软件包名称。它们是一样的。由于谷歌不允许在开发过程中安装手机应用程序时自动安装android wear应用程序的功能,上传到p

  • 每当我尝试运行我的应用程序时,屏幕截图中的窗口就会弹出。声明找不到默认活动,因此我无法部署我的应用程序: 我的代码清单文件 这就是我点击运行时得到的窗口- 我的代码的Gradle文件:

  • 我们有一个应用程序,利用在应用程序计费。我们看到的问题如下: 当使用较高版本代码的构建被上传到Play Developer控制台时,In App Billing将停止在设备上的应用程序(使用较低版本代码)上工作,表示“应用程序未配置为计费”。 这很好,在测试的时候,但问题是--当应用程序在Google Play商店中时,会有什么行为?当您替换应用程序(以执行更新)时,处于野生状态(具有较低版本代码