webview 从输入字段打开相机,无需文件选择器

2024-01-08

我的个人应用程序快完成了,就是按下输入字段,用相机拍照并将其上传到外部php服务器。最后一部分工作正常。我只是无法让它按照我想要的方式工作。当我按下网络视图(外部源)中的输入字段时,我会看到名为“图像选择器”的菜单,其中包含选项:相机和文档。我想在按下输入字段时直接获取相机。

这是我的外部 html 页面,由 webview 加载:

<form id="uploadimage"  action="" method="post" enctype="multipart/form-data">
  <input type="file" style="display: none;" id="upload_file" name="upload_file" accept="image/*" capture="camera" />
  <input type="submit" name='submit_image' id="clickme"  value="Upload Image"/>
 </form>

这是我的 MainActivity.java 文件:

public class MainActivity extends AppCompatActivity{
    WebView webView;
    private static final String TAG = MainActivity.class.getSimpleName();
    private String mCM;
    private ValueCallback mUM;
    private ValueCallback<Uri[]> mUMA;
    private final static int FCR=1;

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent){
        super.onActivityResult(requestCode, resultCode, intent);
        if(Build.VERSION.SDK_INT >= 21){
            Uri[] results = null;
            //Check if response is positive
            if(resultCode== Activity.RESULT_OK){
                if(requestCode == FCR){
                    if(null == mUMA){
                        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)};
                        }
                    }
                }
            }
            mUMA.onReceiveValue(results);
            mUMA = null;
        }else{
            if(requestCode == FCR){
                if(null == mUM) return;
                Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
                mUM.onReceiveValue(result);
                mUM = null;
            }
        }
    }

    @SuppressLint({"SetJavaScriptEnabled", "WrongViewCast"})
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(com.medion.panningen.logphoto.R.layout.activity_main);

        if(Build.VERSION.SDK_INT >=23 && (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, 1);
        }

        webView = (WebView) findViewById(com.medion.panningen.logphoto.R.id.ifView);
        assert webView != null;
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAllowFileAccess(true);

        if(Build.VERSION.SDK_INT >= 21){
            webSettings.setMixedContentMode(0);
            webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
        }else if(Build.VERSION.SDK_INT >= 19){
            webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
        }else {
            webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
        webView.setWebViewClient(new Callback());
        webView.loadUrl("http://localhost/mobile/photo/index2.php");
        webView.setWebChromeClient(new WebChromeClient(){

            //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("*/*");
                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;
            }
        });
    }
    public class Callback extends WebViewClient{
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){
            Toast.makeText(getApplicationContext(), "Failed loading app!", Toast.LENGTH_SHORT).show();
        }
    }
    // Create an image file
    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);
    }
    @Override
    public boolean onKeyDown(int keyCode, @NonNull KeyEvent event){
        if(event.getAction() == KeyEvent.ACTION_DOWN){
            switch(keyCode){
                case KeyEvent.KEYCODE_BACK:
                    if(webView.canGoBack()){
                        webView.goBack();
                    }else{
                        finish();
                    }
                    return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig){
        super.onConfigurationChanged(newConfig);
    }
}

替换这一行:

Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);

为了这:

Intent chooserIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

webview 从输入字段打开相机,无需文件选择器 的相关文章

  • 在 java GUI 中更新 JTree

    我在 GUI 中使用了 JTree 并将其添加到 JFrame 中 当我想更新它并更改程序另一部分中的节点时 当程序运行时 作为执行的操作 我尝试添加新节点或删除节点 但我的界面没有改变 请给我建议一个解决方案 regards 除了 ins
  • 输入流的问题

    以下是我将在我的项目中使用的代码片段的一部分 public String fetchFromStream try int charVal StringBuffer sb new StringBuffer while charVal inpu
  • Android - Google 地图触摸和拖动标记

    如何在地图活动上移动标记 而无需长按并按住该标记直到它获得焦点 我只想触摸和拖动 但它需要大约 1 2 秒才能接收焦点并触发拖动事件 这是我的代码 mMap googleMap mMap setMapType GoogleMap MAP T
  • 在 Glide 4 中使用 AppGlideModule 中的 RequestOptions

    我使用了带有 AppGlideModule 的 Glide 库 库版本为 4 1 1 这是我的滑翔模块类 GlideModule public class GlideUtil extends AppGlideModule private f
  • 使用 RxJava 和播放服务愿景时出现致命信号 11 (SIGSEGV)

    在我的应用程序中 我使用图片中人物位置的定义 之后 我使用 RxJava 处理生成的图像并输出结果 完成后重新运行该过程 所有这些都可以在三星 华为 魅族等设备上完美运行 Android 5 0 及更高版本 但在小米 无论什么版本的andr
  • JavaFX 可以在 Android 上运行吗?

    如果不这样做那就太可惜了 因为这将使 Android 应用程序看起来更有吸引力 现在还不行 要让它发挥作用将是一项艰巨的任务 Android 不具备典型桌面 JRE 所具备的所有库 尽管Android是开源的并且它会运行任何可以编译为Dal
  • 过滤ListView后无法获取item的实际位置

    这是我的MainActivity java我在哪里定义了一个OnClickListener在物品上 在这里 过滤后我总是得到错误的项目值 如果有 10 个项目ListView然后过滤后 如果我得到 3 个项目 并且正确的位置是 3 6 9
  • 如何使用 Android Studio 和 Java 32 位?

    今天我想尝试将一些 Eclipse 项目迁移到 Android Studio 但遇到了一些问题 当我打开Android Studio时 它说我需要安装64位JDK 于是我搜索了这个问题 发现需要打开studio exe而不是默认的studi
  • Google App Engine - “java.lang.IllegalArgumentException:数据存储事务或写入太大。”

    当使用 400 个键调用 DatastoreService delete keys 时 出现以下异常 java lang IllegalArgumentException 数据存储事务或写入太大 我认为批量删除的限制是 500 所以我远远低
  • 应该尝试...catch进入循环内部还是外部?

    我有一个看起来像这样的循环 for int i 0 i lt max i String myString float myNum Float parseFloat myString myFloats i myNum 这是一个方法的主要内容
  • 真实设备中的 Android strace

    我有以下情况 我想监控Android手机上的系统调用 所以 我编写了一个脚本来做到这一点 使用 Android 模拟器可以完美地工作 将应用程序的痕迹写入我的 Ubuntu 上的特定文件中 问题是当我连接一个真实的手机来分析它时 它在结果文
  • 使用 PhoneGap for Android:无法在数据库中创建表

    背景 我是 PhoneGap 的新手 尝试在 Android 上使用 HTML5 PhoneGap 在 SQLite 中创建一个简单的表 这是我的 HTML 代码 使用 PhoneGap 网站的参考代码
  • 哪一种是在 Android 中实现 OnClickListener 的最佳方式? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 哪一种是在 Android 中实现 OnClickListener 接口的最佳方法 第一的 public class EmployeeActiv
  • Android底部导航栏定制

    我已经成功实现了简单的底部栏 它看起来像图 1 但我想进一步自定义它 这样它就可以看起来像 Youtube 的 Android 应用程序中的底部栏 当您单击其中一个项目时 它会传播阴影效果 我当前的底部栏 YouTube 的底部栏 我还想将
  • 有没有适用于 Android 的精简版 SVG 查看器? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Android 是否支持查看 SVG 文件 或者是否有适用于 Android 平台的第 3 方 SVG
  • 无法在 Android 模拟器上运行 systrace 工具

    用于 Android 设备性能分析的 Systrace 工具未在 ubuntu 中的 Android 模拟器上执行 我尝试了以下相同的方法 但最终遇到了同样的问题 1 首先我尝试挂载 sys kernel debug然后出现它的只读文件系统
  • 让 Jsoup 支持通过 JavaScript 动态生成 html

    现在我正在开发一个网络爬虫 这个应该解析一些特定的站点并将输出输出到 xml 文件中 到目前为止 没有问题 Crawler 可以工作 您可以通过 cfg 文件快速自定义它 我使用 Jsoup 来解析 HTML 内容 我刚刚添加了几个站点 发
  • 要在应用为主题的按钮样式中使用layout_marginLeft?

    我使用了一个属性layout marginLeft 30dip 采用为按钮定义的样式 当我为每个按钮单独应用此样式时 左边距将根据我的需要放置 但后来我定义了一个主题 将按钮样式分配给属性android buttonStyle并将其应用到我
  • JBoss Weld + java.lang.OutOfMemoryError:永久代空间

    我刚刚切换到 Weld 以利用 CDI JSF 2 Beans 对话范围 这是我的 Maven 依赖项
  • Android 中的错误消息“HTTP 413 请求实体太大”

    当我使用 POST 方法使用 Multipart Part 发送图像文件时 它抛出此错误 retrofit2 adapter rxjava HttpException HTTP 413 请求实体太大 通过该错误 很明显您在请求中发送的文件大

随机推荐

  • 解析 Facebook logInInBackgroundWithReadPermissions (Swift)

    我已成功设置 Parse 1 7 1 SDK 和 Facebook v4 SDK 设置桥接头文件和 AppDelegate swift 现在在我的 ViewController 中 我正在尝试创建 Facebook 登录 并且我正在尝试使用
  • read.csv 在 R 中警告“EOF 在引用的字符串中”,但在 EXCEL 中成功读取

    我尝试读取从下载的 csv 文件here https d396qusza40orc cloudfront net repdata 2Fdata 2FStormData csv bz2 我用下面的代码阅读 storm data read cs
  • 网络爬虫的典型礼貌因素?

    网络爬虫的典型礼貌因素是什么 除了始终遵守robot txt 禁止 和非标准 抓取延迟 但是 如果站点没有指定显式的抓取延迟 则默认值应该设置为多少 我们使用的算法是 If we are blocked by robots txt Make
  • RazorEngine 中的 using-Statement(没有 MVC 中的 HtmlHelper)

    我使用的是 RazorEngine 没有 MVC 框架 这意味着我没有用于创建模板的 HtmlHelper 没关系 反正我不需要它的任何方法 但我需要创建自己的方法 例如 BeginForm 现在这些都是用 HtmlHelper ViewC
  • 在 Chrome 上将 drawImage 与 Canvas 结合使用非常慢

    我一直在尝试使用drawImage 将SVG 文件的大量实例绘制到画布上 通过使用 SVG 作为源创建单个图像元素 然后对画布上的每个实例使用 drawImage 我希望即使有大量实例也可以非常快速地在画布中生成合成图像 就性能而言 这在
  • nt!KeWaitForSingleObject 不带参数

    我目前正在尝试调试系统死锁 但我很难理解这一点 Child SP RetAddr Args to Child Call Site fffff880 035cb760 fffff800 02ecef72 00000000 00000002 f
  • C++ SQL数据库比较[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 合并特定日期范围内的 Pandas DataFrame

    我有 2 个数据框 一个为Invoice Data另一个用于Promotion Dates Invoice Data数据框 LocationNo InvoiceDate InvoiceAmount A 01 Jul 20 79 B 01 J
  • 在 Firefox 中的新选项卡中打开链接

    我正在开发一个 Firefox 扩展 如何才能在新标签页中打开网页上的所有链接 这通常是 Firefox 中处理新链接的可配置选项 因此它们可能会用它覆盖您的扩展 然而 The code a href http www example co
  • Django自递归外键过滤器查询所有子项

    我有一个带有自引用外键关系的模型 class Person TimeStampedModel name models CharField max length 32 parent models ForeignKey self null Tr
  • ios UIImage 超出 UIImageView 边框

    这里黑色边框显示 UIImageView 的父 UIView 红色边框显示 UIImageView 我正在从服务器下载图像 但图像超出了 UIImageView 区域 如图所示 我正在以编程方式进行此操作 任何帮助将不胜感激 我在下面添加代
  • C# FTP,如何检查路径是文件还是目录?

    我有一个包含一些 FTP 路径的数组 如下所示 ftp ip 目录 目录1 ftp ip 目录 目录2 ftp ip 目录 文件 txt ftp ip 目录 directory3 ftp ip 目录 another file csv 如何确
  • 标准 C 中是否有推荐的整数类型来存储函数指针

    C99标准有uintptr t 一个推荐的整数类型 用于将数据指针 指向对象的指针 转换为 但我没有找到等效的整数类型来存储函数指针 是我忽略了吗 特定的编译器可以定义这样的类型 即使它不在标准中 但编译器更有可能声明函数指针可以存储在 例
  • 圆形鱼眼图像扭曲为平面图像

    截至 2015 年 11 月 12 日更新 我将 PanoTools 插件与 Photoshop 和 Hugin 一起使用 并使用了所有这些参数 最终我找到了满足我最低要求的投影 HFOV 和图像输出尺寸参数 参数 Processed Ou
  • ActiveX (COM) 控件在被其父控件关闭时进行清理的正确方法是什么?

    我遇到的问题是 我的 net 控件在包装以供 ActiveX 使用时无法正确清理 当我尝试关闭 SDK 的测试容器应用程序 TstCon32 exe 时 默认行为会使它作为无 GUI 进程运行 我最初通过谷歌找到的解决方法是覆盖 WndPr
  • 在 Ruby 中反转哈希值

    我如何反转哈希中的元素 保持相同的值和键 但反转它们在哈希中的顺序 Like so 4 gt happiness 10 gt cool lala gt 54 1 gt spider 并将其转换为 1 gt spider lala gt 54
  • PHP 在文本区域中回显时显示 \r\n 字符

    我的数据正在读取从数据库 文本 保存的数据 我的问题是它也有这些字符 r n 我怎样才能阻止这些字符的显示 在将数据库文本放入文本区域之前 调用 nl2br 函数作为参数 r n 字符是 ASCII 不可见 字符 编码回车和换行 http
  • Android 主屏幕小部件(图标、标签 - 样式)

    我正在尝试创建一个可以放置在 Android 主屏幕上的图标 小部件 1 个单元 x 1 个单元 该小部件的外观和行为与 Android 中的其他标准快捷方式完全相同 它将有一个图标 在该标签下有一个标签 可以使用轨迹球 可突出显示 选择它
  • Web 应用程序和 API 在同一个 Laravel 项目中?

    我正在尝试找出构建我即将开始的新项目的最佳方法 我们目前有一个网络应用程序和一个移动应用程序 它们都通过 API 提供数据 目前 Web 应用程序是在安装 CodeIgniter 时完成的 而 API 是在单独安装 CodeIgniter
  • webview 从输入字段打开相机,无需文件选择器

    我的个人应用程序快完成了 就是按下输入字段 用相机拍照并将其上传到外部php服务器 最后一部分工作正常 我只是无法让它按照我想要的方式工作 当我按下网络视图 外部源 中的输入字段时 我会看到名为 图像选择器 的菜单 其中包含选项 相机和文档