①在AndroidManifest.xml文件中添加如下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
②在onCreate函数中检查这些权限(该操作仅针对安卓6.0及以上的用户,低版本用户可能不需要这一步)
onCreate函数中请求权限
requestPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
requestPermission(Manifest.permission.RECORD_AUDIO);
requestPermission函数如下:
private void requestPermission(String permission){
if(ContextCompat.checkSelfPermission(this, permission)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this, new String[]{permission}, 0);
3.onCreate函数中初始化录音文件存储路径
fileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/audiorecordertest.amr";
4.开始录音函数,创建录音对象并进行设置
public boolean startRecord() {
recorder = new MediaRecorder();
try {
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
}catch (IllegalStateException e){
Log.i(LOG_TAG, "设置录音源失败");
e.printStackTrace();
recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
recorder.setOutputFile(fileName);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
recorder.prepare();
}catch (IOException e){
Log.e(LOG_TAG, "准备失败");
e.printStackTrace();
recorder.start();
Log.i(LOG_TAG, "开始录音...");
return true;
}
5.停止录音函数
public void stopRecord() {
recorder.stop();
recorder.reset();
recorder.release();
recorder = null;
Log.i(LOG_TAG, "停止录音");
6.以上安卓的本地Java代码,在网页端需要调用这些方法来实现本地录音功能
7.当完成录音后,录音内容会存储在fileName变量对应的本地文件中,此时需要将该文件取出到前端web页面中,然后完成文件上传
首先需要在web页面中嵌入一个隐藏的表单来获取文件:
<form id="submit-file" style="display: hidden;" action="upload_file.php" method="post" enctype="multipart/form-data">
<input id="ttt" type="file" name="file" accept="audio/amr" />
</form>
然后模拟一次文件选择和表单提交操作,将文件获取到前台来,并上传文件内容。
引入相关js文件:
<script src="jquery-3.2.1.js"></script>
<script src="jquery-form.js"></script>
模拟选择文件并上传:
// 获取录音文件并上传
$("#ttt").trigger("click");
window.setTimeout(function(){
$("#submit-file").ajaxSubmit(function(message) {
$("body").append("<p>"+message+"</p>");
}, 3000);
其中延时三秒是为了确保文件已经由后台传输至前台页面,同时ajax提交会只提交表单而不会发生跳转。其中模拟点击事件会触发webview本地的onFileChooser函数,具体如下:
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
result.confirm(JSBridge.callJsPrompt(MainActivity.this, webView, message));
return true;
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
File f = new File(fileName);
if(f.exists()){
Uri u = Uri.fromFile(f);
filePathCallback.onReceiveValue(new Uri[]{u});
return true;
});
8.服务器端需要对上传的文件接收并进行转码,由于录音生成到的是amr文件,通过ffmpeg可以转码成mp3文件。服务器端php代码如下:
if ($_FILES ["file"] ["error"] > 0) {
echo "Return Code: " . $_FILES ["file"] ["error"] . "<br />";
} else {
if (file_exists ( "upload/" . $_FILES ["file"] ["name"] )) {
echo $_FILES ["file"] ["name"] . " already exists. ";
} else {
move_uploaded_file ( $_FILES ["file"] ["tmp_name"], "upload/" . $_FILES ["file"] ["name"] );
// TODO 文件转码,此处需要重新设计生成的文件的名称
exec("upload\\ffmpeg.exe -i upload\\audiorecordertest.amr "."upload\\1.mp3");
// 直接返回文件存储的路径,并将其构建成一个audio元素
echo "<audio src='http://192.168.250.191/android_test/assets/upload/1.mp3' controls='controls'>";
4.5.4、触发menu 64
4.5.5、Context Menu和Options Menu菜单的区别 64
4.5.6、Context menus for expandable lists 64
4.6、LISTVIEW 66
4.6.1、ListView自定义分割线 66
4.6.2、LIST例一 66
4.6.3、LIST例二 76
4.6.4、LIST例三 80
4.6.5、ListView 被选中item的背景颜色 82
4.6.6、ListView自定义背景颜色 83
4.6.7、List长按与短按消息映射 84
4.6.8、点击ListView改变背景色 87
4.6.9、自动滚动ListView 88
4.6.10、BaseExpandableListAdapter例 88
4.6.11、列表视图(List View) 96
4.6.12、NoteList 99
4.7、TAB与TABHOST 106
4.8、RATINGBAR 110
4.8.1、例一 110
4.8.2、例二 112
4.9、DATE/TIME SET 115
4.9.1、DatePicker/TimePicker 115
4.9.2、DatePickerDialog/TimePickerDialog 119
4.10、WEBVIEW 120
4.10.1、WebView的使用 120
4.11、SCROLLVIEW 121
4.11.1、ScrollView的使用 121
4.12、GRIDVIEW 124
4.12.1、GridView的使用 124
4.13、GAMEVIEW 127
4.13.1、显示到一个布局中 127
4.14、TOASTE 128
4.14.1、短时间显示 128
4.14.2、长时间显示 128
4.15、对话框 128
4.15.1、简单的对话框: 128
4.15.2、包含两个按钮的对话框 128
4.15.3、三个按钮的提示框 129
4.15.4、包含输入的dlg 131
4.15.5、圆形进度框 133
4.15.6、AlertDialog.Builder 133
4.15.7、模式对话框 134
4.16、拖动BUTTON获得位置 135
5、ANDROID UI 美化 137
5.1、简单美化BUTTON、IMAGEBUTTON、TEXTVIEW等控件 137
5.2、BUTTON美化案例☆ 139
5.3、IMAGEBUTTON 按下时的动画效果 142
5.4、滚动条显示与隐藏 143
5.5、LISTVIEW 与 SCROLLVIEW 解决办法 144
方法一:(重写ListView) 144
方法二: 150
5.6、3D魔方 151
6、ANDROID UI 动画 160
6.1、四种2D动画 160
6.1.1、透明度控制动画效果 alpha 160
6.1.2、旋转动画效果 rotate 161
6.1.3、尺寸伸缩动画效果 scale 162
6.1.4、位置转移动画效果 translate 163
6.1.5、四种动画效果的调用 164
7、异步调用 167
开辟一个线程: 167
THREAD: 168
HANDER 170
TIMER 173
ANDROID 界面刷新 174
MESSAGE HANDER 175
用法: 175
线程与子线程调用MessageHander 177
Messagehandler实例 177
8、数据存储与读取 179
1. PREFERENCES 179
2. FILES 180
3. DATABASES 180
4. NETWORK 183
5、CONTENTPROVIDER 183
6、执行SQL语句进行查询 188
用法1 188
其它: 188
详解: 189
查看SQLITE表格内容 192
9、常用功能的实现 193
9.1、获取手机型号以及系统版本号 193
9.2、更改应用程序图标 194
9.3、迎合不同的手机分辨率 194
9.4.ANDROID屏幕适应的四个原则 195
9.5、ANDROID常用单位 196
9.6、取得屏幕信息 197
9.7、横竖屏 197
9.8、程序完全全屏 200
9.8.1锁屏锁键盘 200
9.9、程序的开机启动 201
9.10、动态START页面 208
9.11、彻底退出当前程序 212
9.12、获取应用程序的名称,包名,版本号和图标 212
9.13、调用ANDROID INSTALLER 安装和卸载程序 215
9.14、后台监控应用程序包的安装&卸载 216
9.15、显示应用详细列表 224
9.16、寻找应用 224
9.17、注册一个BROADCASTRECEIVER 225
9.18、打开另一程序 225
9.19、播放默认铃声 225
9.20、设置默认来电铃声 226
9.21、位图旋转 227
9.22、手机震动控制 228
9.23、SENSOR2D感应实例 228
9.24、运用JAVA MAIL包实现发GMAIL邮件 230
9.26、ANDROID键盘响应 236
9.27、后台监听某个按键 238
9.28、VECTOR用法 239
9.29、CURSOR 242
9.30、把一个字符串写进文件 244
9.31、把文件内容读出到一个字符串 245
9.32、扫描WIFI热点演示实例教程 246
9.33、调用GOOGLE搜索 249
9.34、调用浏览器 载入某网址 249
9.35、获取 IP地址 249
9.36、从输入流中获取数据并以字节数组返回 250
9.37、通过ANDROID 客户端上传数据到服务器 251
9.38、文件下载类 255
9.39、下载文件的进度条提示 263
9.40、通过HTTPCLIENT从指定SERVER获取数据 265
9.41、通过FTP传输文件,关闭UI获得返回码 266
9.42、激活JAVASCRIPT打开内部链接 266
9.43、清空手机COOKIES 267
9.44、检查SD卡是否存在并且可以写入 267
9.45、获取SD卡的路径和存储空间 268
9.46、将程序安装到SD卡 268
9.47、创建一个SD映像 269
9.48、查看手机内存存储 269
9.49、在模拟器上调试GOOGLE MAPS 271
9.50、建立GPRS连接 273
9.51、获取手机位置 274
9.5* 获得经纬度,地名标注在地图上 274
9.52、获得两个GPS坐标之间的距离 276
9.53、通过经纬度显示地图 277
9.54、路径规划 277
9.55、将坐标传递到GOOGLE MAP并显示 277
9.56、获取本机电话号码 280
9.57、获得手机联系人 280
9.58、2.0以上版本查询联系人详细信息 282
9.59、2.0以上版本添加联系人 285
9.60、拨打电话 287
9.61、发送SMS、MMS 287
9.62、监听电话被呼叫状态 288
9.63、监听要拨打的电话(可以后台进行修改号码) 290
9.64、后台监听短信内容 291
9.65、删除最近收到的一条短信 292
9.66、调用发短信的程序 293
9.67、后台发送短信 293
9.68、调用发送彩信程序 294
9.69、发送EMAIL 294
9.70、播放多媒体 295
9.71、控制音量 296
9.72、定义CONTENTOBSERVER,监听某个数据表 302
9.73、打开照相机 303
9.74、从GALLERY选取图片 303
9.75、打开录音机 303
9.76、语音朗读 303
9.77、手机获取视频流显示在电脑上 305
9.78、蓝牙的使用 313
9.79、一个很好的加密解密字符串 316
9.80、DRAWABLE、BITMAP、BYTE[]之间的转换 318
9.81、高循环效率的代码 320
9.82、给模拟器打电话发短信 321
9.83、加快模拟器速度 321
9.83.1、模拟器 “尚未注册网络” 322
9.84、EMULATOR命令行参数 322
9.85、如何进行单元测试 323
9.86、ANDROID自动化测试初探 324
9.86.1、捕获Activity上的Element 324
9.86.2、Hierarchyviewer 捕获Element的 328
9.86.3、架构实现 330
9.86.4、模拟键盘鼠标事件(Socket+Instrumentation实现) 332
9.86.5、再述模拟键盘鼠标事件(adb shell 实现) 334
9.87、反编译APK 344
9.88、更换APK图标(签名打包) 348
9.89、利用ANDROID MARKET赚钱 363
9.90、ANDROID-MARKET 使用 365
9.91、传感器 369
9.91.1、获取手机上的传感器 369
9.91.2、 371
9.92、时间类 372
* 获得日期或时间字符串 372
* num天前的日期 373
* num天后的日期 373
* 判断 thingdate 的 dotime 天后是否在今天之后 374
* 判断testDate+testTime是否在两个时间之内 375
附录: 378
附录1、XML布局中的常用属性 378
1.通用属性 378
2.Edit Text部分属性 381
3.layout_alignParentRight android:paddingRight 384
附录2、INTENT ACTION 385
附录3、ANDROID的动作、广播、类别等标志 387
★★★附带工具包说明 393
1.APK反编译工具.rar 393
2.APK安装工具.rar 393
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses.
当浏览器需要摄像头或者麦克风时,都会弹出确认摄像头和麦克风权限弹框
小编最近在做webrtc的项目,用的是内嵌的X5内核的webview进行语音视频通话,但每次启动app都会弹出权限对话框,原本想在js上解决这个问题,结果是没法解决,因为这对于浏览器来说是一个安全性的问题,防止访问网页时,在不知名的情况下摄像头被打开,涉及到隐私的问题,所以只能在webview中想办法。
原生的web...
近日项目集成了个带聊天
功能的
Webview,一开始只是文字聊天后来增加需求要可以发文字/图片/
语音等,一开始使用
Webview自带的授权来
实现录音功能的,只要授权即可,后面由于IOS的不
支持,导致要跟IOS一致,本地写几个方法.
1.开始
录音
2.暂停
录音
3.取消
录音
4.发送转换后的数据到后台,后台在处理.
先来看下
webview的本地
录音实现方法,
老规矩,界面就一个进度条和
webview,
webview采用的是Bridge
WebView方便交互,Bridge
WebView库
转的,文章来源package oeg.mospi.agatenativewebview;import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;import android.app.Activity;
import android.app.AlertDialog;
import android.content