热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android与js交互上传图片

第一步:获取网络权限,读写文件权限

第一步:获取网络权限,读写文件权限

<uses-feature android:name&#61;"android.hardware.camera"/>
<uses-feature android:name&#61;"android.hardware.camera.autofocus"/>
<uses-permission android:name&#61;"android.permission.INTERNET"/>
<uses-permission android:name&#61;"android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name&#61;"android.permission.READ_EXTERNAL_STORAGE"/>

第二步&#xff1a;加载本地写好的html文件&#xff08;定义好js提供给Android的调用方法jsCallAndroid()和安卓提供给js的调用接口upload()&#xff09;放在assets目录下。


<html>
<head>
<meta charset&#61;"UTF-8">
<title>title>
<style>
body{
text-align: center;
}

.one{
border: 3px solid blue;
}

.two{
border: 3px solid transparent;
}

style>
head>
<body>
<img id&#61;"photo" class&#61;"one" src&#61;"img/image3.png" width&#61;"300" height&#61;"300"/><br>
<button id&#61;"btn_jscallandroid" onclick&#61;"jsCallAndroid()">点击上传button><script type&#61;"text/Javascript">function jsCallAndroid(){var str&#61;"点击上传";/*objName就是在android客户端通过代码注入的java对象*/objName.upload();}function setImag(path){document.getElementById("photo").src&#61;""&#43;path}function androidCallJsAddBorder(){document.getElementById("photo").className&#61;"one";}function androidCallJsRemoveBorder(){document.getElementById("photo").className&#61;"two";}
script>
body>
html>

第三步&#xff1a;Android部分代码&#xff1a;

public class MainActivity extends AppCompatActivity {private WebView mWebView;private Button mBtnAddBorder;private Button mBtnRemoveBorder;private SweetAlertDialog dialog;&#64;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initViews();initData();initListener();}/*** 初始化UI*/private void initViews() {mWebView &#61; (WebView) findViewById(R.id.webview);mBtnAddBorder &#61; (Button) findViewById(R.id.btn_addborder);mBtnRemoveBorder &#61; (Button) findViewById(R.id.btn_removeborder);}private void initData() {WebSettings settings &#61; mWebView.getSettings();//设置编码settings.setDefaultTextEncodingName("utf-8");//支持jssettings.setJavascriptEnabled(true);settings.setBlockNetworkImage(false);//设置本地调用对象及其接口mWebView.loadUrl("file:///android_asset/html/webview2js.html");//第二个参数相当于对象名&#xff0c;要和js中保持一致mWebView.addJavascriptInterface(new Test(), "objName");}private void initListener() {//调用js方法给图片移除边框mBtnRemoveBorder.setOnClickListener(new View.OnClickListener() {&#64;Overridepublic void onClick(View v) {mWebView.loadUrl("Javascript: androidCallJsRemoveBorder()");}});mWebView.setWebViewClient(new WebViewClient() {&#64;Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl("file:///android_asset/html/webview2js.html");return true;}});//调用js方法给图片增加边框mBtnAddBorder.setOnClickListener(new View.OnClickListener() {&#64;Overridepublic void onClick(View v) {//调用无参方法 假如有参的话 例如传一个字符串 //需要在括号中用单引号把要传的字符串引起来 整型变量 直接写即可mWebView.loadUrl("Javascript: androidCallJsAddBorder()");}});}class Test {/*** 这里需要注意的是&#xff0c;在Android4.2.2及之后的版本只有带有* JavascriptInterface注释的public方法才能够被js访问。* 所以要在show()方法前加&#xff1a;&#64;JavascriptInterface*/&#64;JavascriptInterfacepublic void upload() {dialog &#61; new SweetAlertDialog(MainActivity.this);dialog.setCanceledOnTouchOutside(true);dialog.setTitleText("请选择获取头像方式&#xff01;").setCancelText("打开相册").setConfirmText("打开相机").setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() {&#64;Overridepublic void onClick(SweetAlertDialog sweetAlertDialog) {//打开相册openAlbum();}}).setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {&#64;Overridepublic void onClick(SweetAlertDialog sweetAlertDialog) {//打开相机openCamera();}}).show();}}/*** 打开相册*/private void openAlbum() {Intent mIntent &#61; new Intent(Intent.ACTION_PICK);//mIntent.addCategory(Intent.CATEGORY_OPENABLE);mIntent.setType("image/*");startActivityForResult(mIntent, 1);dialog.dismiss();}/*** 打开相机*/private void openCamera() {//拍照上传Intent intent &#61; new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//下面这句指定调用相机拍照后的照片存储的路径if (SDCardUtils.getInstance().ExistSDCard()) {File tempFile &#61; new File(Environment.getExternalStorageDirectory()&#43; "/androidtojs/" &#43; "photo.jpg");if (!tempFile.exists()) {tempFile.getParentFile().mkdirs();}// 从文件中创建uriUri uri &#61; Uri.fromFile(tempFile);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);}startActivityForResult(intent, 2);dialog.dismiss();}&#64;Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {case 1: //打开相册返回try {if (data !&#61; null) {Uri uri &#61; data.getData(); // 返回的是一个Uriif (uri !&#61; null) {String path &#61; UriUtils.getInstance().getPath(MainActivity.this, uri);if (path &#61;&#61; null || path.equals("")) {Toast.makeText(MainActivity.this, "没找到图片,请拍照",Toast.LENGTH_SHORT).show();return;}File s &#61; new File(path);if (s.exists()) {Toast.makeText(MainActivity.this, path, Toast.LENGTH_SHORT).show();mWebView.loadUrl("Javascript:setImag(&#39;" &#43; path &#43; "&#39;)");} else {Toast.makeText(MainActivity.this, "没找到图片,请拍照",Toast.LENGTH_SHORT).show();}}} else {Toast.makeText(MainActivity.this, "没找到图片,请拍照", Toast.LENGTH_SHORT).show();}} catch (Exception e) {}break;case 2: //打开相机返回if (resultCode &#61;&#61; RESULT_OK) {//处理拍照if (SDCardUtils.getInstance().ExistSDCard()) {File temp &#61; new File(Environment.getExternalStorageDirectory()&#43; "/androidtojs/" &#43; "photo.jpg");if (!temp.exists()) {temp.getParentFile().mkdirs();}String path &#61; temp.getPath();mWebView.loadUrl("Javascript:setImag(&#39;" &#43; path &#43; "&#39;)");} else {Toast.makeText(MainActivity.this, "未找到存储卡&#xff0c;无法存储照片&#xff01;", Toast.LENGTH_SHORT).show();}}break;}}
}

注意&#xff1a;该程序在安卓6.0下拍照上传之后显示不了的解决方法&#xff1a;
在build.gradle下把targetSdkVersion设置为22 &#xff0c;因为安卓6.0需要获取存取权限。


推荐阅读
  • HPE OEM Brocade 300 交换机无中断固件升级指南
    本文详细介绍了如何通过FTP方式对HPE OEM Brocade 300交换机进行无中断固件升级,确保网络服务的连续性。 ... [详细]
  • web页面报表js下载,web报表软件 ... [详细]
  • 开发笔记:前端之前端初识
    开发笔记:前端之前端初识 ... [详细]
  • 使用HTML和JavaScript实现视频截图功能
    本文介绍了如何利用HTML和JavaScript实现从远程MP4、本地摄像头及本地上传的MP4文件中截取视频帧,并展示了具体的实现步骤和示例代码。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 解决网页乱码问题的实用方法
    网页乱码问题在开发中较为常见,主要由文件编码、程序字符集设置和数据库连接字符集设置不当引起。本文将详细介绍如何逐一排查并解决这些问题。 ... [详细]
  • 本文介绍了如何使用开源工具ChkBugReport来解析和分析Android设备的Bugreport。ChkBugReport能够将复杂的Bugreport转换为易于阅读的HTML报告,并提供详细的图表和分析结论。 ... [详细]
  • 我自己做了一个网站图片的抓取,感觉速度有点慢抓取4000张图片可能得用15分钟左右的时间,我百度看用线程可以加快抓取,然后创建了5个线程抓取,但是5个线程是同步执行同样的操作一个图片就 ... [详细]
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 本文介绍了如何使用Postman构建和发送HTTP请求,包括四个主要部分:方法(Method)、URL、头部(Headers)和主体(Body)。特别强调了Body部分的重要性,并详细说明了不同类型的请求体。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 微信小程序详解:概念、功能与优势
    微信公众平台近期向200位开发者发送了小程序的内测邀请。许多人对微信小程序的概念还不是很清楚。本文将详细介绍微信小程序的定义、功能及其独特优势。 ... [详细]
  • CTF竞赛中文件上传技巧与安全绕过方法深入解析
    CTF竞赛中文件上传技巧与安全绕过方法深入解析 ... [详细]
author-avatar
harekoc_303
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有