The solution of html <input type = "file "> in webview not work

MySQL下载和安装教程 1.下载MySQL数据库可以访问官方网站:https://www.mysql.com/ 2.点击DOWNLOADS模块下的Community模块下的MySQL Community Server进行下载。 由于目前最新版本是:MySQL Community Server 5.7.21 建议博友下载历史版本,本博下载的是5.6.39 下载步骤: 进入,选择MySQL的版本及主机 根据自己的电脑选择相应的位数进行下载,本机是64位,点击download。 进入下. 阅读详情

Refer: https://github.com/mgks/Os-FileUp/blob/master/app/src/main/java/com/inf/os/fileup/MainActivity.java

package com.inf.os.fileup;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity{
    WebView webView;
    private static final String TAG = MainActivity.class.getSimpleName();
    private String mCM;
    private ValueCallback<Uri> 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){
                        //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(R.layout.activity_main);

        webView = (WebView) findViewById(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 if(Build.VERSION.SDK_INT >=11 && Build.VERSION.SDK_INT < 19){
            webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
        webView.setWebViewClient(new Callback());
        webView.loadUrl("https://infeeds.com/");
        webView.setWebChromeClient(new WebChromeClient(){
            //For Android 3.0+
            public void openFileChooser(ValueCallback<Uri> uploadMsg){
                mUM = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("*/*");
                MainActivity.this.startActivityForResult(Intent.createChooser(i,"File Chooser"), FCR);
            }
            // For Android 3.0+, above method not supported in some android 3+ versions, in such case we use this
            public void openFileChooser(ValueCallback uploadMsg, String acceptType){
                mUM = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("*/*");
                MainActivity.this.startActivityForResult(
                        Intent.createChooser(i, "File Browser"),
                        FCR);
            }
            //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("*/*");
                MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), MainActivity.FCR);
            }
            //For Android 5.0+
            public boolean onShowFileChooser(
                    WebView webView, ValueCallback<Uri[]> filePathCallback,
                    WebChromeClient.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);
    }
}
晶闸管选型参数,结构原理,工艺与注意问题总结 闸管(Thyristor)是一种半导体开关器件,也被称为可控硅整流器(SCR, Silicon Controlled Rectifier)。它可以在高电压和大电流条件下工作,常被用于交流电的控制和整流。本文对晶闸管的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。 阅读详情

相关推荐

i茅台APP加密参数逆向分析:MT-Device-ID与mt-v生成算法

在移动应用安全领域,参数加密是防止API滥用的重要手段。通过对通信协议的逆向分析,可以揭示加密参数的生成原理,这对理解移动应用安全机制具有重要意义。以i茅台APP为例,其关键接口使用了MT-Device-ID和mt-v两个加密参数,前者基于设备硬件信息生成,后者则通过动态签名机制确保请求时效性。这类技术广泛应用于电商、金融等需要高安全性的场景。通过抓包工具和逆向工程手段,可以还原出从设备指纹生成到动态签名的完整技术链条,其中涉及MD5、SHA256等常见哈希算法的应用。掌握这些加密参数的生成逻辑,不仅有助于

weixin_28568819的博客 322

input type=‘file‘ 上传同一个文件失效,无反应

input type='file' 上传同一个文件失效,无反应 用inputfile上传文件,掉用onchange方法时,多次上传同一个文件时功能失效,不会发送ajax请求 input[type=file]使用的是onchange去做,onchange监听的为input的value值,只有再内容发生改变的时候去触发,而value在上传文件的时候保存的是文件的内容,你只需要在上传成功的回调里面,将当前input的value值置空即可。event.target.value=“”; 设为空之后...

Crazy_GirlLL的博客 1535

手把手教你用三极管搭建麦克风音频放大电路(附完整电路图)

本文详细介绍了如何使用三极管搭建麦克风音频放大电路,包括电路设计基础、元件选择、完整电路图及分步焊接指南。通过实际操作和调试技巧,帮助电子爱好者和学生深入理解模拟电路原理,实现音质清晰的音频放大效果。

Black的专栏 988

微信内置浏览器input[file]选择图片后刷新

最近做一个微信公众号,jquery-mobile做的页面。有图片上传功能,而且还是8张图片同时上传(不要问我手机怎么整这么多图片上传,客户强烈要求的)。安卓手机选择图片时候,有的选择一张,有的选择多张,页面就直接刷新,原来填写的数据全没了,还要从新填写(本来填写项目就多)。而且刷新是不固定的,调试了N久,直到现在,还会有这个情况发生。上网查找也没有具体答案。最靠谱的说法就是手机内不足。 ”手机运

CommonBorage 1万+

Frida实战:SSL Pinning绕过技术全解析

本文详细解析了如何使用Frida工具绕过SSL Pinning技术,包括环境搭建、四种实战绕过方案及常见问题排查指南。通过具体代码示例和实战经验,帮助安全研究人员快速掌握SSL Pinning绕过技术,适用于金融类App的安全测试场景。

weixin_42530732的博客 188

固定资产报废的损失鉴定怎么做?

在社会生产的日常中,企业经常会遇到固定资产报废的损失鉴定,那么怎么去做鉴定?哪些情况下能申请固定资产报废损失鉴定呢? 今天,华碧鉴定就和大家说一说固定资产报废损失鉴定那些事儿。 符合下列条件之一的固定资产可申请报废: 1、使用年限过长,功能丧失,完全失去使用价值,或不能使用并无修复价值的; 2、产品技术落后,质量差,耗能高,效率低,已属淘汰且不适于继续使用,或技术指标已达不到使用要求的; 3、严重损坏,无法修复的或虽能修复,但累计修理费已接近或超过市场价值的; 4、主要附件损坏,无.

weixin_50362670的博客 2118

GetComponentsInChildren Not Work In OnDisable[Unity]

The article will tell you why GetComponentsInChildren not work in OnDisable event.

xak的专栏 1675

tcllib2.0 package - csv

tcl lib 的csv库

shin 861

android进入应用黑屏原因以及解决方案

android 界面进入黑屏解决方案: .1 原因 加载onCreate 方法 执行方法加载数据耗时,需要跑完onCreate和onResume才会显示界面.2 闪黑屏的原因主要是我们启动Activity的时候,需要跑完onCreate和onResume才会显示界面。也就是说需要处理一些数据后,才会显示。按照这种思路,是不是我把初始化的工作尽量减少就可以避免黑屏?事实是,就算你onCreate啥都不

java_goodstudy的博客 2万+

固定时间收敛的控制器设计(基础知识)

针对控制系统的有限时间收敛和固定时间收敛给出一些常用定理。

qq_40241332的博客 1万+

Unity3D 2022版如何一键安装Newtonsoft.Json?最新Package Manager教程

本文详细介绍了在Unity3D 2022及以上版本中,如何通过Package Manager一键安装和配置Newtonsoft.Json(Json.NET)。教程涵盖了从打开Package Manager、搜索并安装正确包源,到验证安装和基础使用的完整流程,旨在帮助开发者以现代化、可靠的方式集成这一强大的JSON处理框架,提升开发效率并规避手动导入的常见问题。

lg888的博客 922

android 设置进入全屏,取消全屏的几种方式

我将这三个设置代码写在一个工具类当中,当你要对某个Activity调用这三个功能的时候,把Activity本身作为参数传递进去即可。 import android.app.Activity; import android.view.Window; import android.view.WindowManager;public class CommonUtil { /** * 设置隐

java_goodstudy的博客 1万+

基于网关实现不同网段S7-1200 CPU的通信方法

在A网段的计算机上ping B网段的计算机:在A网段的计算机上使用ping命令,向B网段的计算机发送数据包。在B网段的计算机上ping A网段的计算机:同样地,在B网段的计算机上使用ping命令,向A网段的计算机发送数据包。数据包也会经过路由器进行转发,最终到达A网段的计算机。配置路由器:在路由器上配置两个网段的IP地址和子网掩码,并设置路由表,使得路由器可以将A网段和B网段之间的数据进行转发。确定两个网络之间的路由器:假设需要将A网段和B网段进行通信,需要在A、B两个网段之间设置一台路由器。

电工 2402

android 模拟器无法启动问题解决

Android 模拟器无法运行解决方案  : http://stackoverflow.com/questions/39322338/ubuntu-16-04-genymotion-dev-hw-random-not-found 这个问题让人很蛋疼,不看visual box 报错 真心搜寻不到关键词解决 1down votefavorit

java_goodstudy的博客 9004

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ioc 与 DI | 区别简介

看到一个对这个概念很好诠释的帖子,特转发过来供大家一起学习 转载地址http://www.iteye.com/topic/692793    在android butterknife 中采用注解 依赖注入 那么什么是依赖注入呢与ioc 又有什么联系  IoC——Inversion of Control  控制反转  DI——Dependency Injection   依

java_goodstudy的博客 4742

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android 协调者布局title 字体大小颜色修改,设置布局为最上层

开发中遇到一个问题 布局事件无效 料想不是最上层布局 一试果真如此  // put the control to the view top playView.bringToFront(); 另一个问题 协调者布局中 title 字体过大 遥记得,在google 提供的 切换tab中 需要在dimens 中定义字体大小方才生效,而在协调者布局中只需要在sty

java_goodstudy的博客 4335

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

android 修改状态栏颜色

android状态栏颜色修改 android状态栏颜色修改   状态栏颜色的修改在4.4和5.x环境下分别有不同的方式,低于4.4以下是不能修改的。   5.x环境下 方式一,状态栏将显示为纯净的颜色,没有渐变效果 1 2 3 4 5 6 7 8 9

java_goodstudy的博客 3326

flutter methodchannel调用原生方法,实现原生插件

在获取手机电量,屏幕信息等,都需要flutter 调用原生实现,这部分flutter 官方已经帮我们实现好了,对于部分功能,需要自己实现, 步骤如下 # 创建一个 flutter 应用,使用 as 打开 android 目录, MainActivity 代码如下 package com.example.flutter_app; import android.content.Intent; i...

java_goodstudy的博客 2930

b+c 模式 H5 与 Android 混合 开发详解

h5 ios android 简介: 概念: 加载网址 加载网页 加载网页字符串 点击内容的时候 会调到浏览器 我们可以让其在当前页展示:h5 可以利用WebView,做一款app,混合开发,如果只是展示数据的话,只仅仅给你一个网址,就可以去访问了。 h5 : 优点 变化比较快,界面都放在服务器上了,服务器的网页一遍,界面全都变了。 h5 做布

java_goodstudy的博客 2894

android webView setWebChromeClient and setWebClient

android.webkit库聚合了webkit内核的浏览器功能,webview就是她的一个控件,可以使得网页轻松的内嵌到app里。 并且比较强大的是,还可以直接跟js相互调用。 webview有两个方法:setWebChromeClient和setWebClient setWebChromeClient主要处理解析,渲染网页等浏览器做的事情 WebChromeClie

java_goodstudy的博客 2578

解决Wifi,耳机 等广播接收两次现象

最近在写一个项目,遇到了断开连接网络时,广播接收两次现象,根据广播接收特性很好解决这个问题,我们可以在 contentReceiver 中定义一个标记变量, 当每次调用此方法的时候,执行++方法,再通过接口回调的方式,利用系统收到广播后自动回调 onReceiver() 方法,实现分辨出两次广播实现代码如下: public class MusicReceiver extends BroadcastR

java_goodstudy的博客 2293

scrollview 嵌套 recyclerview 滑动惯性消失问题解决,recclerview 滑到底部事件

滚动到顶部判断: getScrollY() == 0 滚动到底部判断: View childView = getChildAt(0); childView.getMeasuredHeight() <= getScrollY() + getHeight(); 其中getChildAt表示得到ScrollView的child View childView.getMeasuredHeight()表示得到子

java_goodstudy的博客 2133

关于Calling View methods on another thread than the UI thread的错误

在原生的界面使用分享没一点问题,各项正常,然后加载webview的时候,在webview中去进行分享,QQ,微信等都没问题,但是微博分享却尼玛报错,心里一万只草泥马~~控制台抛出Calling View methods on another thread than the UI thread此异常,一看名字UI,thread,心里猜想这应该是UI线程问题,然后网上找找资料一看果然如此,因为在webv

java_goodstudy的博客 2035

Gson,FASTjson 解析字符串为数组,日期等方式

混淆打包.1 java 是既需要 解释 也需要编译 执行 .2 变量名 不是给 机器看的(在字节码文件中可以找到哦),这些方法名变量名对执行完全无用是程序员看的,class 中行号,把java语句编程字节码文件,这些发生语句在哪一行都会标出,混淆就是将这些删掉,类名等全删掉, jvm 解释型 直接用内存地址引用的话可读性太差 class 中对执行 完全无用 :方法名 变量名 类名 在class

java_goodstudy的博客 1999

ubuntu adb 配置, genymotion 安装使用

在ubuntu 中 as 中找不到原生 模拟器,经尝试各种方法依然无效,先是adb 指令配置 linux 环境变量配置在 /etc/profile 文件中 , 在此文件中将sdk 的tool 与 platform-tool 配置上即可 配置原因:配置完成之后 在全局使用 adb 如同 在tools 目录下 用 adb进行执行#set path for android sdk tools export

java_goodstudy的博客 1881

Swift 也能做爬虫:URLSession、HTML 解析与数据可视化全流程解析

在苹果生态中,Swift 不只是用于 iOS、macOS 客户端开发,借助并发能力、HTML 解析库与原生 Swift Charts,我们可以实现一套端到端数据采集、清洗、可视化的完整链路。不同于 Python 爬虫成熟的数据分析栈,Swift 爬虫更适合 macOS 本地工具、iOS 数据采集 App、Vapor 后端数据统计场景;爬取网页公开数据后,直接在 SwiftUI 中渲染折线图、柱状图,免去跨语言数据传递,类型安全、性能可控。

Z_suger7的博客 428
上一篇: android This 与 activity.this
下一篇: android coordinatorLayout 使用简介
一朵红杏
博客等级 码龄12年 51粉丝 282原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值