您的位置:首页 > Web前端 > JavaScript

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

2014-08-06 17:13 615 查看
  上篇博文已经说明,本篇直接进入主题。本篇大致说明总体功能以及代码用途,下篇将功能点逐一详细说明。

  功能点包括:

  拍照相关接口(camera)

功能函数名称

作用

备注

invokeCamera()

调用摄像头拍照

requestAlbum()

调用相册功能

requestAlbumMulti()

相册多选

requestAlbumMultiUpload()

相册多选完后上传

  2.  录音相关接口(media)

功能函数名称

作用

备注

startRecord()

录制音频

stopRecord()

停止录制

playRecord()

播放录制完成的音频

stopPlay()

停止播放录制完成的音频

upload()

上传音频文件

  3.  二维码、条形码扫码(scan)

功能函数名称

作用

备注

scan()

扫描条码

  4.  其他接口

功能函数名称

作用

备注

saveLoginInfo ()

保存登陆信息

app需要web浏览器网页数据时

  PS:后续会根据需要增加其他功能

  调用摄像拍照,上传语音文件等功能,最终要上传到服务器。所以请先搭建好服务器,这里我是自己搭建了PHP服务器。接收请求参数file,类型为文件,服务器部分您可以自己实现,不在本博文内容范围内。后期为便于大家测试之用,应该会将接口公布在外网。

  将分3部分说明,贴出部分代码,后续文章同样遵循此步骤。

  1.JS文件部分

android部分采用系统addJavascriptInterface添加js接口的方式实现

ios部分采用拦截特定的请求实现

核心js函数(之后的js调用都用到此函数)

  

/**
*@description Web js communications with mobile terminal local function
*@author yanrongxiang
*@date 2014-7-17
*/
function controllerCenter(type,cmd,params){
if(navigator.userAgent.toLowerCase().indexOf('iphone')>0){
document.location="http://QM_APP_WEBVIEW_ENGINE:"+cmd+":"+params;
}else if(navigator.userAgent.indexOf('Android')>0){
eval('javascript:QM_APP_WEBVIEW_ENGINE_'+type+'.'+cmd+'("'+params+'")');
}else{
alert("Can't use this feature");
}
}


使用javascript调用摄像头及相册部分

  

//Access to the camera function
var $camera={
"invokeCamera":function(params){
controllerCenter('camera','invoke_camera',params);
},
"requestAlbum":function(params){
controllerCenter('camera','request_albums',params);
},
"requestAlbumMulti":function(params){
controllerCenter('camera','request_albums_multi',params);
},
"requestAlbumMultiUpload":function(params){
controllerCenter('camera','request_albums_multi_upload',params);
}
}


使用javascript调用录音,播放部分

//Access to the media function
var $media={
"startRecord":function(params){
controllerCenter('media','start_record',params);
},
"stopRecord":function(params){
controllerCenter('media','stop_record',params);
},
"playRecord":function(params){
controllerCenter('media','play_record',params);
},
"stopPlay":function(params){
controllerCenter('media','stop_play',params);
},
"upload":function(params){
controllerCenter('media','upload_to_server',params);
}
}


使用javascript调用二维码,条形码扫描部分

var $scanbar={
"scan":function(params){
controllerCenter('scan','scan_bar',params);
}
}


    

  2.android端实现

  说明:以下为android应用启动展现的第一个activity,在此activity里面放入Webview控件,请求服务器html页面

  

package com.qimeng.activity;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Notification;
import android.content.ContentResolver;
import android.content.DialogInterface;
import android.content.DialogInterface.OnKeyListener;
import android.content.res.Resources;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.baidu.android.pushservice.BasicPushNotificationBuilder;
import com.baidu.android.pushservice.CustomPushNotificationBuilder;
import com.baidu.android.pushservice.PushConstants;
import com.baidu.android.pushservice.PushManager;
import com.qimeng.R;
import com.qimeng.api.JSInterfaceAPI;
import com.qimeng.common.BaseActivity;
import com.qimeng.common.IBaseActivity;
import com.qimeng.workman.common.imgsupload.util.Bimp;
import com.qimeng.workman.common.imgsupload.util.FileUtils;

/**
*
*/
@SuppressLint("SetJavaScriptEnabled") public class IndexActivity extends BaseActivity implements IBaseActivity {
private String[] paramJS;
EditText tv_url;
public WebView webView;
private Handler myHandler;
JSInterfaceAPI jsApi = new JSInterfaceAPI();
private static final int REQUEST_CODE_UPLOAD = 300;
public static final int REQUEST_CODE_MULTI_UPLOAD = 3001;
public static final int REQUEST_CODE_MEDIA_UPLOAD = 3002;
private JSInterfaceCamera jsInterfaceCamera;
private JSInterfaceMedia jsInterfaceMedia;
private JSInterfaceSetting jsInterfaceSetting;
private JSInterfaceScanbar jsInterfaceScanbar;
public int currentUploadNums=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_index);
myHandler=new Handler();
webView=(WebView)this.findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
//webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
//webView.getSettings().setAllowFileAccess(true);// 设置允许访问文件数据
//webView.getSettings().setSupportZoom(true);
//webView.getSettings().setBuiltInZoomControls(true);
//webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
//webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
//webView.getSettings().setDomStorageEnabled(true);
//webView.getSettings().setDatabaseEnabled(true);
//webView.getSettings().setLoadsImagesAutomatically(true);
tv_url=(EditText)findViewById(R.id.tv_url);
Button btn=(Button)findViewById(R.id.btn_ok);
tv_url.setText("http://10.1.2.123/webview/");
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
webView.loadUrl(tv_url.getText().toString());
}
});

webView.setWebChromeClient(new WebChromeClient(){
@Override
public boolean onJsAlert(WebView view, String url, String message,
JsResult result) {
AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
builder.setTitle("提示").setMessage(message).setPositiveButton("确定", null);
// 不需要绑定按键事件
// 屏蔽keycode等于84之类的按键
builder.setOnKeyListener(new OnKeyListener() {
public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {
Log.v("onJsAlert", "keyCode==" + keyCode + "event="+ event);
return true;
}
});
// 禁止响应按back键的事件
builder.setCancelable(false);
AlertDialog dialog = builder.create();
dialog.show();
result.confirm();// 因为没有绑定事件,需要强行confirm,否则页面会变黑显示不了内容。
return true;
}
});
jsInterfaceCamera=new JSInterfaceCamera(this, myHandler);
jsInterfaceMedia=new JSInterfaceMedia(this, myHandler);
jsInterfaceSetting=new JSInterfaceSetting(this, myHandler);
jsInterfaceScanbar=new JSInterfaceScanbar(this, myHandler);
//添加js与本地代码通讯接口
webView.addJavascriptInterface(jsInterfaceCamera, "QM_APP_WEBVIEW_ENGINE_camera");
webView.addJavascriptInterface(jsInterfaceMedia, "QM_APP_WEBVIEW_ENGINE_media");
webView.addJavascriptInterface(jsInterfaceSetting, "QM_APP_WEBVIEW_ENGINE_setting");
webView.addJavascriptInterface(jsInterfaceScanbar, "QM_APP_WEBVIEW_ENGINE_scan");
//集成百度推送
PushManager.startWork(this, PushConstants.LOGIN_TYPE_API_KEY, "SQgonTuwWx3cQc2wPxYimgCQ");
Resources resource = this.getResources();
String pkgName = this.getPackageName();
CustomPushNotificationBuilder cBuilder = new CustomPushNotificationBuilder(
getApplicationContext(), resource.getIdentifier(
"notification_custom_builder", "layout", pkgName),
resource.getIdentifier("notification_icon", "id", pkgName),
resource.getIdentifier("notification_title", "id", pkgName),
resource.getIdentifier("notification_text", "id", pkgName));
cBuilder.setNotificationFlags(Notification.FLAG_AUTO_CANCEL);
cBuilder.setNotificationDefaults(Notification.DEFAULT_SOUND
| Notification.DEFAULT_VIBRATE);
//cBuilder.setStatusbarIcon(this.getApplicationInfo().icon);
cBuilder.setLayoutDrawable(resource.getIdentifier("simple_notification_icon", "drawable", pkgName));
PushManager.setNotificationBuilder(this, 1, cBuilder);
}

public void refresh(final Object... param) {
super.refresh(param);
int flag = ((Integer) param[0]).intValue();// 获取第一个参数
switch (flag) {
case 10001:
break;
case REQUEST_CODE_UPLOAD:
webView.post(new Runnable() {
@Override
public void run() {
webView.loadUrl("javascript:"+paramJS[1]+"(\""+(paramJS.length>=2?param[1].toString():"Can't get the callback, confirm your parameters correctly")+"\")");
}
});
break;
case REQUEST_CODE_MULTI_UPLOAD:
currentUploadNums++;
webView.post(new Runnable() {
@Override
public void run() {
webView.loadUrl("javascript:"+paramJS[1]+"(\""+(paramJS.length>=2?param[1].toString():"Can't get the callback, confirm your parameters correctly")+"\","+Bimp.drr.size()+","+currentUploadNums+")");
if(currentUploadNums<Bimp.drr.size()){
File f=new File(Bimp.drr.get(currentUploadNums).toString());
jsApi.uploadPhoto((paramJS[0].indexOf("http:")==0?"":"http://")+paramJS[0], f, IndexActivity.this, IndexActivity.REQUEST_CODE_MULTI_UPLOAD);
}
}
});
break;
case REQUEST_CODE_MEDIA_UPLOAD:
webView.post(new Runnable() {
@Override
public void run() {
jsInterfaceMedia.isRecorded=0;
webView.loadUrl("javascript:"+paramJS[1]+"(\""+(paramJS.length>=2?param[1].toString():"Can't get the callback, confirm your parameters correctly")+"\")");
}
});
break;
}
}

public void initListener() {
super.initListener();
}

public void initView() {
super.initView();
}
private Bitmap bmp;
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==jsInterfaceScanbar.SELECT_SCANER){
if(resultCode == 1){
Bundle bundle = data.getExtras();
Log.e("##############JFKDJFDKJFKDFJ############", "{\"Result\":\""+bundle.getString("Result")+",\"Format\":\""+bundle.getString("Format")+"\"}");
webView.loadUrl("javascript:"+paramJS[0]+"({\"Result\":\""+bundle.getString("Result")+"\",\"Format\":\""+bundle.getString("Format")+"\"})");
}
}else{
if(resultCode == RESULT_OK){
upload_carmare_photo(data);
}
}
}
protected void onRestart() {
super.onRestart();
if(Bimp.drr.size()>0){
//            如果为相册多选回到主界面时
StringBuffer sb=new StringBuffer();
//List<String> list = new ArrayList<String>();
sb.append("[");
for (int i = 0; i < Bimp.drr.size(); i++) {
//String Str = Bimp.drr.get(i).substring(
//        Bimp.drr.get(i).lastIndexOf("/") + 1,
//        Bimp.drr.get(i).lastIndexOf("."));
//list.add(FileUtils.SDPATH+Str+".JPEG");
sb.append("{\"path\":\""+Bimp.drr.get(i).toString()+"\"}");
if(i<Bimp.drr.size()-1){
sb.append(",");
}
}
sb.append("]");
final String sbStr=sb.toString();
//调用网页函数
if(paramJS.length>2){
webView.post(new Runnable() {
@Override
public void run() {
webView.loadUrl("javascript:"+paramJS[2]+"("+sbStr+")");
}
});
}else{
webView.loadUrl("javascript:"+paramJS[2]+"(\"Can't get the callback, confirm your parameters correctly\")");
}
}
}
public String[] getParamJS() {
return paramJS;
}

public void setParamJS(String[] paramJS) {
this.paramJS = paramJS;
}

public void     upload_carmare_photo(final Intent data){
Thread thread=new Thread(){
@Override
public void run() {
super.run();
//选择图片
Uri uri = data.getData();
ContentResolver cr = IndexActivity.this.getContentResolver();
try {
if(bmp != null)//如果不释放的话,不断取图片,将会内存不够
bmp.recycle();
bmp = BitmapFactory.decodeStream(cr.openInputStream(uri));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("the bmp toString: " + bmp);
File fileDir = new File(Environment.getExternalStorageDirectory() + "/Myimage");
if (!fileDir.exists()) {
fileDir.mkdirs();// 创建文件夹
}
File file = new File(Environment.getExternalStorageDirectory()
+ "/Myimage/", String.valueOf(System.currentTimeMillis())
+ ".png");
FileOutputStream fos;
try {
fos = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG, 50, fos);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(bmp!=null){
jsApi.uploadPhoto((paramJS[0].indexOf("http:")==0?"":"http://")+paramJS[0], file, IndexActivity.this, REQUEST_CODE_UPLOAD);
}
}

};
thread.start();
}
}


  3.IOS端实现

  说明:以下为IOS应用启动展现的第一个ViewController,在此视图控制器里面放入UIWebview控件,请求服务器html页面

//
//  QMViewController.m
//  QMWebView
//
//  Created by Qimeng Tech on 14-7-15.
//  Copyright (c) 2014年 Qimeng Tech. All rights reserved.
//

#import "QMViewController.h"
#import "QMUtil.h"
#import "SecurityUtil.h"
#import "JSONKit.h"
#import "FileUtil.h"
#import "Toast+UIView.h"
#import "MLAudioRecorder.h"
#import "AmrRecordWriter.h"
#import <AVFoundation/AVFoundation.h>
#import "MLAudioMeterObserver.h"

@interface QMViewController ()
@property (nonatomic, strong) MLAudioRecorder *recorder;
@property (nonatomic, strong) AmrRecordWriter *amrWriter;

@property (nonatomic, strong) AVAudioPlayer *player;

@property (nonatomic, copy) NSString *filePath;
@property (weak, nonatomic) IBOutlet UIButton *recordButton;
@property (nonatomic, strong) MLAudioMeterObserver *meterObserver;
@property (nonatomic,strong) NSTimer *timerStopRecord;
@property (nonatomic,assign) int timerStopNum;
@end

@implementation QMViewController
@synthesize currentParams,webView;
@synthesize currentUploadPhotoNum,selectMultiUploadPhotoUrls;
- (void)viewDidLoad
{
[super viewDidLoad];
self.title=@"启梦浏览器";
if( ([[[UIDevice currentDevice] systemVersion] doubleValue]>=7.0)) {
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.modalPresentationCapturesStatusBarAppearance = NO;
}
self.webView=[[UIWebView alloc] initWithFrame:CGRectMake(0, 0, UI_SCREEN_WIDTH, UI_SCREEN_HEIGHT-20-44)];
self.webView.delegate=self;
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://10.1.2.123/webview/"]]];
[self.view addSubview:self.webView];

self.selectMultiUploadPhotoUrls=[[NSMutableArray alloc] init];
// Do any additional setup after loading the view, typically from a nib.
}
#pragma mark --
#pragma mark UIWebViewDelegate
/**
*截获特殊请求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:JS_CMD_NAME_ALBUM]){
[QMUtil LocalPhotos:self delegate:self];
//调用摄像头
}else if ([cmd isEqualToString:JS_CMD_NAME_CAMERA]){
[QMUtil takeCamera:self delegate:self];
//请求相册列表-多选
}else if([cmd isEqualToString:JS_CMD_NAME_request_albums_multi]){
[FileUtil cleaerImgAreaDirectory];
[FileUtil createImgAreaUploadDirectory];
[self.selectMultiUploadPhotoUrls removeAllObjects];
self.currentUploadPhotoNum=0;
[QMUtil LocalPhotosSelectMulti:self delegate:self];
}else if([cmd isEqualToString:JS_CMD_NAME_request_albums_multi_upload]){
if (self.selectMultiUploadPhotoUrls.count>0) {
[NetWorkUtil uploadFile:[NSString stringWithFormat:@"http://%@",[self.currentParams objectAtIndex:0]] localFilePath:[self.selectMultiUploadPhotoUrls objectAtIndex:0] uploadDelegate:self params:nil code:@"upload_photos_multi"];
}else{
[self.view makeToast:@"没有选择上传图片,无法上传" duration:2.0 position:@"center"];
}
//录制音频
}else if([cmd isEqualToString:@"start_record"]){
if(self.amrWriter==nil){
[self initRecorder];
}
if (self.recorder.isRecording) {
//取消录音
[self.view makeToast:@"正在录音中,请先停止" duration:2.0 position:@"center"];
}else{
//开始录音
[self.recorder startRecording];
self.meterObserver.audioQueue = self.recorder->_audioQueue;
//防止用户不停止,录音会一直继续下去
self.timerStopNum=0;
self.timerStopRecord=[NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(timerFired:) userInfo:nil repeats:NO];
}
}else if([cmd isEqualToString:@"stop_record"]){
if(self.amrWriter==nil){
[self initRecorder];
}
if (self.recorder.isRecording) {
//取消录音
[self.recorder stopRecording];
if(self.timerStopRecord!=nil){
[self.timerStopRecord invalidate];
self.timerStopRecord=nil;
}
}else{
[self.view makeToast:@"还没开始录音" duration:2.0 position:@"center"];
}
}else if([cmd isEqualToString:@"play_record"]){
if(self.player==nil){
self.player = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:self.filePath] error:nil];
}
NSLog(@"%@",self.filePath);
if([self.player isPlaying]){
[self.view makeToast:@"正在播放中,请先停止" duration:2.0 position:@"center"];
}else{
[self.player play];
}
}else if([cmd isEqualToString:@"stop_play"]){
if(self.player==nil){
self.player = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:self.filePath] error:nil];
}
NSLog(@"%@",self.filePath);
if([self.player isPlaying]){
[self.player stop];
}
}else if([cmd isEqualToString:@"upload_to_server"]){
if(!self.filePath){
[self.view makeToast:@"请先录制音频" duration:2.0 position:@"center"];
return NO;
}
[NetWorkUtil uploadFile:[NSString stringWithFormat:@"http://%@",[self.currentParams objectAtIndex:0]] localFilePath:self.filePath uploadDelegate:self params:nil code:@"upload_media"];
}else if([cmd isEqualToString:@"save_login_info"]){
NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
if ([self.currentParams count]>=3) {
[defaults setObject:[self.currentParams objectAtIndex:0] forKey:@"uid"];
}else{
[self.view makeToast:@"请设置正确的参数" duration:2.0 position:@"center"];
}
[defaults synchronize];
//发送推送的userid到服务器
//[NetWorkUtil uploadFile:[NSString stringWithFormat:@"http://%@",[self.currentParams objectAtIndex:0]] localFilePath:self.filePath uploadDelegate:self params:nil code:@"upload_media"];
}else if ([cmd isEqualToString:@"scan_bar"]){
if (TARGET_IPHONE_SIMULATOR) {
ZBarReaderViewController *controller=[[ZBarReaderViewController alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:controller animated:YES];
}
}
return NO;
}
return YES;
}
-(void) timerFired:(id)sender{
self.timerStopNum++;
if(self.timerStopNum==5){
if (self.recorder&&self.recorder.isRecording){
[self.recorder stopRecording];
NSLog(@"时间到,已自动停止录音");
[self.timerStopRecord invalidate];
self.timerStopRecord=nil;
}
}
}
#pragma make QBImagePickerControllerDelegate delegate
#pragma make UIImagePickerControllerDelegate
//当选择一张图片后进入这里
-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
//系统自带的相册单选
if ([picker isKindOfClass:[UIImagePickerController class]]) {
NSString *type = [info objectForKey:UIImagePickerControllerMediaType];
//当选择的类型是图片
if ([type isEqualToString:@"public.image"]){
//关闭相册界面
[picker dismissViewControllerAnimated:YES completion:^{}];
//先把图片转成NSData
UIImage* image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
NSData *data;
//if (UIImagePNGRepresentation(image) == nil){
data = UIImageJPEGRepresentation(image, 0.5);
//}
//else{
//    data = UIImagePNGRepresentation(image);
//}
//图片保存的路径
//这里将图片放在沙盒的documents文件夹中
NSString * DocumentsPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
//文件管理器
NSFileManager *fileManager = [NSFileManager defaultManager];
//把刚刚图片转换的data对象拷贝至沙盒中 并保存为image.png
[fileManager createDirectoryAtPath:DocumentsPath withIntermediateDirectories:YES attributes:nil error:nil];
NSString *path=[DocumentsPath stringByAppendingString:@"/image.png"];
[fileManager createFileAtPath:path contents:data attributes:nil];
//得到选择后沙盒中图片的完整路径
//NSString *filePath = [[NSString alloc]initWithFormat:@"%@%@",DocumentsPath,  @"/image.png"];

//创建一个选择后图片的小图标放在下方
//类似微薄选择图后的效果
UIImageView *smallimage = [[UIImageView alloc] initWithFrame:CGRectMake(50, 120, 40, 40)];
smallimage.image = image;

//上传图片
[NetWorkUtil uploadFile:[NSString stringWithFormat:@"http://%@",[self.currentParams objectAtIndex:0]] localFilePath:path uploadDelegate:self params:nil code:@"upload_photo"];
//操作完后回调网页js
//[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"%@('nihao')",[picker.userParam objectAtIndex:1]]];
;
//加在视图中
//[self.view addSubview:smallimage];
}
}else{
//自定义的相册多选
NSArray *mediaInfoArray = (NSArray *)info;
NSLog(@"Selected %d photos and mediaInfoArray==%@", mediaInfoArray.count,mediaInfoArray);
NSString *resultJson=@"[";
for (int i=0;i<mediaInfoArray.count; i++) {
NSDictionary *mediaInfo = [mediaInfoArray objectAtIndex:i];
UIImage *image= [mediaInfo objectForKey:@"UIImagePickerControllerOriginalImage"];
NSString *fileUrl=[NSString stringWithFormat:@"%@/local_%d.jpg",[FileUtil getImgAreaUploadDirecoty],i];
image=[QMUtil makeThumbnailFromImage:image scale:0.5];
[UIImageJPEGRepresentation(image, 0.5) writeToFile:fileUrl atomically:YES];
//image=[UIUtil makeThumbnailFromImage:image scale:0.7];
//[UIImagePNGRepresentation(image) writeToFile:fileUrl atomically:YES];
resultJson=[resultJson stringByAppendingString:[NSString stringWithFormat:@"{\"path\":\"%@\"}",fileUrl]];
[self.selectMultiUploadPhotoUrls addObject:fileUrl];
if (i<mediaInfoArray.count-1) {
resultJson=[resultJson stringByAppendingString:@","];
}
}
resultJson=[resultJson stringByAppendingString:@"]"];
[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"%@(%@)",[self.currentParams objectAtIndex:2],resultJson]];
[self dismissViewControllerAnimated:YES completion:NULL];
}

}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
NSLog(@"您取消了选择图片");
[picker dismissViewControllerAnimated:YES completion:^{}];
[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"%@('')",[self.currentParams objectAtIndex:2]]];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void) uploadDelegate:(NSString *)response code:(NSString *)code error:(NSError *)error{
if ([response rangeOfString:@"http://"].length==7) {
if ([@"upload_photo" isEqualToString:code]) {
[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"%@('%@')",[self.currentParams objectAtIndex:1],response]];
}else if([@"upload_photos_multi" isEqualToString:code]) {
self.currentUploadPhotoNum++;
[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"%@('%@',%d,%d)",[self.currentParams objectAtIndex:1],response,self.selectMultiUploadPhotoUrls.count,self.currentUploadPhotoNum]];
if (self.currentUploadPhotoNum<self.selectMultiUploadPhotoUrls.count) {
//继续上传
[NetWorkUtil uploadFile:[NSString stringWithFormat:@"http://%@",[self.currentParams objectAtIndex:0]] localFilePath:[self.selectMultiUploadPhotoUrls objectAtIndex:self.currentUploadPhotoNum] uploadDelegate:self params:nil code:@"upload_photos_multi"];
}
}else if ([@"upload_media" isEqualToString:code]) {
[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"%@('%@')",[self.currentParams objectAtIndex:1],response]];
}

}else{
[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"%@('%@')",[self.currentParams objectAtIndex:2],response]];
}
}

-(void) initRecorder{
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
AmrRecordWriter *amrWriter = [[AmrRecordWriter alloc]init];
amrWriter.filePath = [path stringByAppendingPathComponent:@"record.amr"];
amrWriter.maxSecondCount = 60;
amrWriter.maxFileSize = 1024*256;
amrWriter.cafFilePath = [path stringByAppendingPathComponent:@"recordAmr.caf"];
self.amrWriter = amrWriter;

MLAudioMeterObserver *meterObserver = [[MLAudioMeterObserver alloc]init];
meterObserver.actionBlock = ^(NSArray *levelMeterStates,MLAudioMeterObserver *meterObserver){
NSLog(@"volume:%f",[MLAudioMeterObserver volumeForLevelMeterStates:levelMeterStates]);
};
meterObserver.errorBlock = ^(NSError *error,MLAudioMeterObserver *meterObserver){
[[[UIAlertView alloc]initWithTitle:@"错误" message:error.userInfo[NSLocalizedDescriptionKey] delegate:nil cancelButtonTitle:nil otherButtonTitles:@"知道了", nil]show];
};
self.meterObserver = meterObserver;
MLAudioRecorder *recorder = [[MLAudioRecorder alloc]init];
__weak __typeof(self)weakSelf = self;
recorder.receiveStoppedBlock = ^{
[weakSelf.recordButton setTitle:@"Record" forState:UIControlStateNormal];
weakSelf.meterObserver.audioQueue = nil;
};
recorder.receiveErrorBlock = ^(NSError *error){
[weakSelf.recordButton setTitle:@"Record" forState:UIControlStateNormal];
weakSelf.meterObserver.audioQueue = nil;

[[[UIAlertView alloc]initWithTitle:@"错误" message:error.userInfo[NSLocalizedDescriptionKey] delegate:nil cancelButtonTitle:nil otherButtonTitles:@"知道了", nil]show];
};
recorder.bufferDurationSeconds = 0.04;
recorder.fileWriterDelegate = amrWriter;
self.filePath  = amrWriter.cafFilePath; //因为能直接播放是的caf文件,所以给予caf文件地址
self.recorder = recorder;
}
@end

@interface UIWebView (JavaScriptAlert)

- (void)webView:(UIWebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(CGRect *)frame;

@end

@implementation UIWebView (JavaScriptAlert)

- (void)webView:(UIWebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(CGRect *)frame {

UIAlertView* customAlert = [[UIAlertView alloc] initWithTitle:@"提示信息" message:message delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];

[customAlert show];

}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: