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 从输入字段打开相机,无需文件选择器 的相关文章

  • 获取当前 android.intent.category.LAUNCHER 活动的实例

    我创建了一个库项目 并在多个应用程序之间共享 我实现了一个简单的会话过期功能 该功能将在一段时间后将用户踢回到登录屏幕 登录屏幕活动是我的主要活动 因此在清单中它看起来像这样
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • Google 云端硬盘身份验证异常 - 需要许可吗? (v2)

    我一直在尝试将 Google Drive v2 添加到我的 Android 应用程序中 但无法获得授权 我收到 UserRecoverableAuthIOException 并显示消息 NeedPermission 我感觉 Google A
  • 如何使用InputConnectionWrapper?

    我有一个EditText 现在我想获取用户对此所做的所有更改EditText并在手动将它们插入之前使用它们EditText 我不希望用户直接更改中的文本EditText 这只能由我的代码完成 例如通过使用replace or setText
  • 错误:在根项目“projectName”中找不到项目“app”

    我有一个在 Eclipse 中开发的旧应用程序 现在尝试将其迁移到 Android Studio 我更新了库并遵循了基本步骤 现在 我收到此错误 Error Project app not found in root project pro
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 如何根据 gradle 风格设置变量

    我想传递一个变量test我为每种风格设置了不同的值作为 NDK 的定义 但出于某种原因 他总是忽略了最后味道的价值 这是 build gradle apply plugin com android library def test andr
  • Android 套接字和 asynctask

    我即将开始制作一个应该充当 tcp 聊天客户端的应用程序 我一直在阅读和阅读 我得出的结论是最好 如果不需要 将我的套接字和异步任务中的阅读器 问题是我不确定从哪里开始 因为我是 Android 新手 这至少对我来说是一项艰巨的任务 但据我
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 将两个文本视图并排放置在布局中

    我有两个文本视图 需要在布局中并排放置 并且必须遵守两条规则 Textview2 始终需要完整显示 如果布局中没有足够的空间 则必须裁剪 Textview1 例子 文本视图1 文本视图2 Teeeeeeeeeeeeeeeeeextview1
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的
  • android sdk 的位置尚未在 Windows 操作系统的首选项中设置

    在 Eclipse 上 我转到 windows gt Android SDK 和 AVD Manager 然后弹出此消息 Android sdk 的位置尚未在首选项中设置 进入首选项 在侧边栏找到 Android 然后会出现一个 SDK 位
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • 解析 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服务器 最后一部分工作正常 我只是无法让它按照我想要的方式工作 当我按下网络视图 外部源 中的输入字段时 我会看到名为 图像选择器 的菜单 其中包含选项 相机和文档