浏览器端javascript调用手机终端本地功能实现02-功能点汇总
2014-08-06 17:13
615 查看
上篇博文已经说明,本篇直接进入主题。本篇大致说明总体功能以及代码用途,下篇将功能点逐一详细说明。
功能点包括:
拍照相关接口(camera)
2. 录音相关接口(media)
3. 二维码、条形码扫码(scan)
4. 其他接口
PS:后续会根据需要增加其他功能
调用摄像拍照,上传语音文件等功能,最终要上传到服务器。所以请先搭建好服务器,这里我是自己搭建了PHP服务器。接收请求参数file,类型为文件,服务器部分您可以自己实现,不在本博文内容范围内。后期为便于大家测试之用,应该会将接口公布在外网。
将分3部分说明,贴出部分代码,后续文章同样遵循此步骤。
ios部分采用拦截特定的请求实现
核心js函数(之后的js调用都用到此函数)
使用javascript调用摄像头及相册部分
使用javascript调用录音,播放部分
使用javascript调用二维码,条形码扫描部分
功能点包括:
拍照相关接口(camera)
功能函数名称 | 作用 | 备注 |
invokeCamera() | 调用摄像头拍照 | |
requestAlbum() | 调用相册功能 | |
requestAlbumMulti() | 相册多选 | |
requestAlbumMultiUpload() | 相册多选完后上传 |
功能函数名称 | 作用 | 备注 |
startRecord() | 录制音频 | |
stopRecord() | 停止录制 | |
playRecord() | 播放录制完成的音频 | |
stopPlay() | 停止播放录制完成的音频 | |
upload() | 上传音频文件 |
功能函数名称 | 作用 | 备注 |
scan() | 扫描条码 |
功能函数名称 | 作用 | 备注 |
saveLoginInfo () | 保存登陆信息 | app需要web浏览器网页数据时 |
调用摄像拍照,上传语音文件等功能,最终要上传到服务器。所以请先搭建好服务器,这里我是自己搭建了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
相关文章推荐
- 浏览器端javascript调用手机终端本地功能实现01-前言
- 浏览器端javascript调用手机终端本地功能实现03-拍照
- Iframe和a标签的downLoad新属性实现-调用浏览器的本地下载功能
- Flex中不使用FelxPrintJob通过ExternalInterface直接调用JavaScript利用浏览器本身的功能进行打印
- javascript调用浏览器的功能
- 巧用注释实现不支持javascript的浏览器功能优雅降级
- 微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送功能
- jquery实现兼容浏览器的图片上传本地预览功能
- 怎么用程序实现调用Android手机的拍照功能
- JavaScript实现复制功能各浏览器支持情况实测
- jquery实现兼容浏览器的图片上传本地预览功能
- PhoneGap实现javascript脚本调用本地设备的接口
- JavaScript.history实现前进、返回功能_浏览器特效
- javaScript复制功能调用实现方案
- 四十七、实现调用Android手机的拍照功能
- JavaScript实现复制功能各浏览器支持情况实测
- ASP.NET中服务器控件Button调用javascript代码运用正则表达式验证TextBox中输入的是否为正整数或正小数,符合要求则继续运行服务器端代码功能的实现
- 非常简单的兼容多浏览器Javascript实现分页功能
- html中使用javascript调用本地程序(exe、doc等)实现代码