浏览器端javascript调用手机终端本地功能实现03-拍照

上篇大致说明了已实现的功能点及大致的实现方式,本篇详细说明如何通过js调用拍照的相关功能。

js代码部分已经在《浏览器端javascript调用手机终端本地功能实现02》中展现,主要说明android部分和ios部分的实现。请将js代码或文件放在要加载的服务器页面里。

android端实现

  

1 //定义拍照相关接口
2 private JSInterfaceCamera jsInterfaceCamera;
3 //初始化
4 jsInterfaceCamera=new JSInterfaceCamera(this, myHandler);
5 //添加js与本地代码通讯接口
6 webView.addJavascriptInterface(jsInterfaceCamera, "QM_APP_WEBVIEW_ENGINE_camera");

拍照相关接口java文件如下

  1 package com.qimeng.activity;
  2
  3 import java.io.File;
  4
  5 import com.qimeng.workman.common.imgsupload.AlbumListActivity;
  6 import com.qimeng.workman.common.imgsupload.util.Bimp;
  7
  8 import android.content.Intent;
  9 import android.graphics.Bitmap;
 10 import android.net.Uri;
 11 import android.os.Environment;
 12 import android.os.Handler;
 13 import android.provider.MediaStore;
 14 import android.webkit.JavascriptInterface;
 15 import android.widget.Toast;
 16
 17 public class JSInterfaceCamera {
 18     public final int SELECT_PICTURE=10000;
 19     public final int SELECT_CAMER=10002;
 20
 21     private int PHOTO_REQUEST_CODE = 5;
 22     private int ALBUM_REQUEST_CODE = 6;
 23     public IndexActivity context;
 24     public Handler myHandler;
 25     public JSInterfaceCamera(IndexActivity a,Handler h){
 26         this.context=a;
 27         this.myHandler=h;
 28     }
 29     @JavascriptInterface
 30     public void request_albums(final String params){
 31         myHandler.post(new Runnable() {
 32             @Override
 33             public void run() {
 34                 //获取传过来的参数
 35                 context.setParamJS(params.split(","));
 36                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
 37                 intent.addCategory(Intent.CATEGORY_OPENABLE);
 38                 intent.setType("image/*");
 39                 context.startActivityForResult(Intent.createChooser(intent, "选择图片"), SELECT_PICTURE);
 40             }
 41         });
 42     }
 43     @JavascriptInterface
 44     public void request_albums_multi(final String params){
 45         myHandler.post(new Runnable() {
 46             @Override
 47             public void run() {
 48                 //获取传过来的参数
 49                 context.setParamJS(params.split(","));
 50                 //开始图片多选调用
 51                 while(Bimp.drr.size()>0){
 52                     Bimp.drr.remove(0);
 53                 }
 54                 context.startActivityForResult(new Intent(context,AlbumListActivity.class), PHOTO_REQUEST_CODE);
 55             }
 56         });
 57     }
 58     //开始上传
 59     @JavascriptInterface
 60     public void request_albums_multi_upload(final String params){
 61         myHandler.post(new Runnable() {
 62             @Override
 63             public void run() {
 64                 //获取传过来的参数
 65                 context.setParamJS(params.split(","));
 66                 context.currentUploadNums=0;
 67                 if(Bimp.drr.size()>0){
 68                     File f=new File(Bimp.drr.get(0).toString());
 69                     context.jsApi.uploadPhoto(((context.getParamJS()[0].indexOf("http:")==0?"":"http://"))+context.getParamJS()[0], f, context, IndexActivity.REQUEST_CODE_MULTI_UPLOAD);
 70                 }else{
 71                     Toast.makeText(context.getApplicationContext(), "没有选择上传图片,无法上传", Toast.LENGTH_LONG).show();
 72                 }
 73             }
 74         });
 75     }
 76     @JavascriptInterface
 77     public void invoke_camera(final String params){
 78         myHandler.post(new Runnable() {
 79             @Override
 80             public void run() {
 81                 //获取传过来的参数
 82                 context.setParamJS(params.split(","));
 83                 String state = Environment.getExternalStorageState();
 84                    if (state.equals(Environment.MEDIA_MOUNTED)) {
 85                            Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
 86                         File fileDir = new File(Environment.getExternalStorageDirectory() + "/Myimage");
 87                         if (!fileDir.exists()) {
 88                             fileDir.mkdirs();// 创建文件夹
 89                         }
 90                            File file = new File(Environment.getExternalStorageDirectory()
 91                             + "/Myimage/", String.valueOf(System.currentTimeMillis())
 92                             + ".jpg");
 93                            Uri imageUri = Uri.fromFile(file);
 94                            getImageByCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
 95                        context.startActivityForResult(getImageByCamera, SELECT_CAMER);
 96                    }
 97                    else {
 98                        Toast.makeText(context.getApplicationContext(), "请确认已经插入SD卡", Toast.LENGTH_LONG).show();
 99                    }
100             }
101         });
102     }
103 }

ios端实现

在试图控制器viewDidLoad代理中加入以下代码段

//初始化UIWebview
self.webView=[[UIWebView alloc] initWithFrame:CGRectMake(0, 0, UI_SCREEN_WIDTH, UI_SCREEN_HEIGHT)];
//设置代理
self.webView.delegate=self;
//加载服务器页面
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://10.1.2.123/webview/"]]];
[self.view addSubview:self.webView];

处理uiwebview的shouldStartLoadWithRequest代理

/**
 *截获特殊请求url,完成js与本地交互
 */
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

    NSString *requestString = [[request URL] absoluteString];
    NSArray *components = [requestString componentsSeparatedByString:@":"];
    NSRange range=[[components objectAtIndex:1] rangeOfString:@"QM_APP_WEBVIEW_ENGINE"];
    if ([components count] > 3 && range.location == 2 && range.length == 21) {
        NSString *cmd=(NSString *)[components objectAtIndex:2];
        //上传参数1、请求地址;2、成功回调函数;3、失败回调函数
        NSArray *params=[[components objectAtIndex:3] componentsSeparatedByString:@","];
        self.currentParams=params;
        if([cmd isEqualToString:@"invoke_camera"){
            //调用摄像头
            UIImagePickerController * picker = [[UIImagePickerController alloc] init];
            picker.delegate=delegate;
            if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
                picker.sourceType = UIImagePickerControllerSourceTypeCamera;
                picker.navigationBarHidden = NO;
                picker.wantsFullScreenLayout = YES;
            }else{
                NSLog(@"模拟器无法打开相机");
            }
            [self presentViewController:picker animated:YES completion:^{}];
        }
    }
}                    

至此,已实现js调用手机摄像头功能。

  

浏览器端javascript调用手机终端本地功能实现03-拍照

时间: 2024-10-24 21:56:40

浏览器端javascript调用手机终端本地功能实现03-拍照的相关文章

浏览器端javascript调用手机终端本地功能实现02-功能点汇总

上篇博文已经说明,本篇直接进入主题.本篇大致说明总体功能以及代码用途,下篇将功能点逐一详细说明. 功能点包括: 拍照相关接口(camera) 功能函数名称 作用 备注 invokeCamera() 调用摄像头拍照 requestAlbum() 调用相册功能 requestAlbumMulti() 相册多选 requestAlbumMultiUpload() 相册多选完后上传 2. 录音相关接口(media) 功能函数名称 作用 备注 startRecord() 录制音频 stopRecord()

浏览器端javascript调用手机终端本地功能实现01-前言

一直没有写博文的习惯,可能也不是什么好习惯.有了想记下来的技术点,都写成笔记.如今觉得写写博文也挺不错,现在在深圳启梦网络科技有限公司工作,主要工作做app开发.想想自己从java服务器端开发,再到现在安卓,苹果应用软件开发的一路走来,经过了2,3年,深刻的理解不断学习充实自己的好处. 最近公司希望web app轻应用能够调用手机端的一些功能,譬如:拍照,相册选择,录音,播放,文件上传,二维码,条形码扫描,推送等功能.服务器端的一次编码即可完成ios,android端的开发.实现这些功能,核心点

JavaScript HTML5 手机网站 基本功能

让网页的宽度自适应屏幕<meta name="viewport" content="width=device-width"/>   1)html上加入<meta name="viewport" content=" initial-scale=1.0,user-scalable=no" />发确保网页的效果 2)加上以下语句可使网页在苹果设备上运行更好<meta name="apple-m

H5 调用 手机软件的功能

1.调用 邮件 : 参考 https://blog.csdn.net/github_38516987/article/details/77637546 (亲测有效) <a href="mailto:[email protected]">发送邮件</a> 2.调用 拨打手机 <a href="tel:400-888-9999">400-888-9999</a> 3.调用 短信 <a href="sms:1

js调用打印机自动分页的功能(仅适用于IE浏览器)

做个功能需要打印的时候添加分页,哪怕是内容不够也需要分页. 浏览器上显示 打印预览是这样的: 模拟打印出来是这样的 都是显示的是5页,方法很简单.在需要分页的位置加上一行代码: <div class="PageNext"></div> css样式是这样的: .PageNext{page-break-after: always;} 以上就是实现的打印分页的功能. 另外有几个打印的常用方法记录一下. 1.调用打印的方法: wb.execwb(6,6) 2.调用打印预

浏览器端的javascript加载器

commonJS,定义了一种同步加载脚本的规范.对于浏览器端而言,因为js脚本都是在远端,用同步的方式可能会长时间阻塞线程.因此,浏览器端的js加载器并不会严格按照commonJS来做.seajs作为一个试图遵循commonJS规范的加载器,是在规范的基础上在外面包一层define,来异步加载js,以下是seajs官网的一个例子: // 所有模块都通过 define 来定义 define(function(require, exports, module) { // 通过 require 引入依

HTML5调用手机摄像头,仅仅支持OPPOHD浏览器

1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>HTML5调用手机摄像头,仅仅支持OPPOHD浏览器</title> 6 <style> 7 #video { border: 1px solid #ccc; display:inline-block; } 8 #canvas

javascript判断手机浏览器版本信息

<script type="text/javascript"> /* * 智能机浏览器版本信息: * */ var browser={ versions:function(){ var u = navigator.userAgent, app = navigator.appVersion; return {//移动终端浏览器版本信息 trident: u.indexOf('Trident') > -1, //IE内核 presto: u.indexOf('Presto

html5调用手机摄像头,实现拍照上传功能

今天做手机网站,想实现手机扫描二维码功能.首先实现在浏览器中调用手机摄像头,实现拍照功能并且把拍下的照片显示在页面并上传到服务器上,然后再在服务器端进行分析. 首先实现在浏览器中调用摄像头,当然用现在火的不行的html5,html5中的<video>标签,并将从摄像头获得视频作为这个标签的输入来源.实现拍照功能的html5代码: <article> <style scoped> video { transform: scaleX(-1); } p { text-alig