camera.html 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta charset="utf-8"/>
  5. <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
  6. <meta name="HandheldFriendly" content="true"/>
  7. <meta name="MobileOptimized" content="320"/>
  8. <title>Hello H5+</title>
  9. <script type="text/javascript" src="../js/common.js"></script>
  10. <script type="text/javascript">
  11. var i=1,gentry=null,w=null;
  12. var hl=null,le=null,de=null,ie=null;
  13. var unv=true;
  14. var bUpdated=false; //用于兼容可能提前注入导致DOM未解析完更新的问题
  15. // H5 plus事件处理
  16. function plusReady(){
  17. // 获取摄像头目录对象
  18. plus.io.resolveLocalFileSystemURL('_doc/', function(entry){
  19. entry.getDirectory('camera', {create:true}, function(dir){
  20. gentry = dir;
  21. updateHistory();
  22. }, function(e){
  23. outSet('Get directory "camera" failed: '+e.message);
  24. } );
  25. }, function(e){
  26. outSet('Resolve "_doc/" failed: '+e.message);
  27. });
  28. }
  29. if(window.plus){
  30. plusReady();
  31. }else{
  32. document.addEventListener('plusready', plusReady, false);
  33. }
  34. // 监听DOMContentLoaded事件
  35. document.addEventListener('DOMContentLoaded', function(){
  36. // 获取DOM元素对象
  37. hl=document.getElementById('history');
  38. le=document.getElementById('empty');
  39. de=document.getElementById('display');
  40. if(ie=document.getElementById('index')){
  41. ie.onchange=indexChanged;
  42. }
  43. // 判断是否支持video标签
  44. unv=!document.createElement('video').canPlayType;
  45. updateHistory();
  46. },false );
  47. function changeIndex(){
  48. outSet('选择摄像头:');
  49. ie.focus();
  50. }
  51. function indexChanged(){
  52. de.innerText = ie.options[ie.selectedIndex].innerText;
  53. i = parseInt(ie.value);
  54. outLine(de.innerText);
  55. }
  56. // 拍照
  57. function getImage(){
  58. outSet('开始拍照:');
  59. var cmr = plus.camera.getCamera();
  60. cmr.captureImage(function(p){
  61. outLine('成功:'+p);
  62. plus.io.resolveLocalFileSystemURL(p, function(entry){
  63. createItem(entry);
  64. }, function(e){
  65. outLine('读取拍照文件错误:'+e.message);
  66. });
  67. }, function(e){
  68. outLine('失败:'+e.message);
  69. }, {filename:'_doc/camera/',index:1});
  70. }
  71. // 录像
  72. function getVideo(){
  73. outSet('开始录像:');
  74. var cmr = plus.camera.getCamera();
  75. cmr.startVideoCapture(function(p){
  76. outLine('成功:'+p);
  77. plus.io.resolveLocalFileSystemURL(p, function(entry){
  78. createItem(entry);
  79. }, function(e){
  80. outLine('读取录像文件错误:'+e.message);
  81. } );
  82. }, function(e){
  83. outLine('失败:'+e.message);
  84. }, {filename:'_doc/camera/',index:i});
  85. }
  86. // 显示文件
  87. function displayFile(li){
  88. if(w){
  89. outLine('重复点击!');
  90. return;
  91. }
  92. if(!li || !li.entry){
  93. ouSet('无效的媒体文件');
  94. return;
  95. }
  96. var name = li.entry.name;
  97. var suffix = name.substr(name.lastIndexOf('.'));
  98. var url = '';
  99. if(suffix=='.mov' || suffix=='.3gp' || suffix=='.mp4' || suffix=='.avi'){
  100. //if(unv){plus.runtime.openFile('_doc/camera/'+name);return;}
  101. url = '/plus/camera_video.html';
  102. } else {
  103. url = '/plus/camera_image.html';
  104. }
  105. w=plus.webview.create(url,url,{hardwareAccelerated:true,scrollIndicator:'none',scalable:true,bounce:'all'});
  106. w.addEventListener('loaded', function(){
  107. w.evalJS('loadMedia("'+li.entry.toLocalURL()+'")');
  108. //w.evalJS('loadMedia("'+'http://localhost:13131/_doc/camera/'+name+'")');
  109. }, false );
  110. w.addEventListener('close', function(){
  111. w = null;
  112. }, false);
  113. w.show('pop-in');
  114. }
  115. // 添加播放项
  116. function createItem(entry){
  117. var li = document.createElement('li');
  118. li.className = 'ditem';
  119. li.innerHTML = '<span class="iplay"><font class="aname"></font><br/><font class="ainf"></font></span>';
  120. li.setAttribute('onclick', 'displayFile(this)' );
  121. hl.insertBefore( li, le.nextSibling );
  122. li.querySelector('.aname').innerText = entry.name;
  123. li.querySelector('.ainf').innerText = '...';
  124. li.entry = entry;
  125. updateInformation(li);
  126. // 设置空项不可见
  127. le.style.display = 'none';
  128. }
  129. // 获取录音文件信息
  130. function updateInformation(li){
  131. if(!li || !li.entry){
  132. return;
  133. }
  134. var entry = li.entry;
  135. entry.getMetadata(function(metadata){
  136. li.querySelector('.ainf').innerText = dateToStr(metadata.modificationTime);
  137. }, function(e){
  138. outLine('获取文件"'+entry.name+'"信息失败:'+e.message);
  139. } );
  140. }
  141. // 获取录音历史列表
  142. function updateHistory(){
  143. if(bUpdated||!gentry||!document.body){//兼容可能提前注入导致DOM未解析完更新的问题
  144. return;
  145. }
  146. var reader = gentry.createReader();
  147. reader.readEntries(function(entries){
  148. for(var i in entries){
  149. if(entries[i].isFile){
  150. createItem(entries[i]);
  151. }
  152. }
  153. }, function(e){
  154. outLine('读取录音列表失败:'+e.message);
  155. });
  156. bUpdated = true;
  157. }
  158. // 清除历史记录
  159. function cleanHistory(){
  160. hl.innerHTML = '<li id="empty" class="ditem-empty">无历史记录</li>';
  161. le = document.getElementById('empty');
  162. // 删除音频文件
  163. outSet('清空拍照录像历史记录:');
  164. gentry.removeRecursively(function(){
  165. // Success
  166. outLine('成功!');
  167. }, function(e){
  168. outLine('失败:'+e.message);
  169. });
  170. }
  171. </script>
  172. <link rel="stylesheet" href="../css/common.css" type="text/css" charset="utf-8"/>
  173. <style type="text/css">
  174. .aname {
  175. font-size: 16px;
  176. }
  177. .ainf {
  178. font-size: 12px;
  179. }
  180. .iplay {
  181. display: block;
  182. background: no-repeat right center url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABYCAYAAAADWlKCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKwwAACsMBNCkkqwAAABZ0RVh0Q3JlYXRpb24gVGltZQAwOS8xMi8xM5w+I3MAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzVxteM2AAAD9UlEQVR4nO2b3XETMRRGDwzvoYOkg5hRAVkqiKmAdIA7wHSQVECoALsC1gXciV0BTge4gvCwgnHk9d/+WF8m97ztxrlXs8fS1Urym6enJxwd3uZugPMcFyKGCxHDhYjhQsRwIWK4EDFciBguRAwXIoYLEcOFiOFCxHAhYrgQMVyIGC5EDBcihgsRw4WI4ULEcCFiuBAx3uVuwDGY2XtgCBTAALjc8tEFMAdKYBJC+HOK9nXBm5dwUM7MCmAEXDcMMQVuQwhlV23qC2khZjYAboGrjkLOgFEIYd5RvM6RrSFmdgs80J0MYqyHGFsSuR4S60TJ9vrwCEziZ+YhhGXy/xdU9aWgqjfnW+IsgEKtvkgJiUPUPfUyZsD42DoQ68+Y+p62AG6UhjAZITt6xopq3L9vGf+Gqh6dJX+S6ilKNaRkU8YCGLSVARBjDGLMdS5jbgkkhMQiWyejSGtEG2KsghopKoU++5AV68ZDcrvXYWTH8Pghdz1R6CHpN3MFDPsc02PsYcy1qy0nJ6uQOANKZz+jfcOUmd3H6W1jYo5RcvsqtikbuXtI+kBmBxbwz8DczMZtksdcsz1tOinZhMRxPF2bGh8R4gz4amZLMxu2aEqa8zq2LQs5e0j6EB8bLv6dAz/NrGwyjMWcj3vadjJyCimS60nLeFfAbzO7bfANT3MXLdvSmJxCBsl12VHcL8AyvpkfSpo7bdvJyCkkfQfocv5/Bnw3s/mBs6Y097aFzd7JPcv6T5dv5GtcAr/2TZN7yt0IGSE908k0+RS8FiEvhhd1yKEFUw5YAVBApoe0XQrZwgL4GEIY7pLRU+5G5OwhC57PZgbAsqPYK6rdxUMXC9Npbro8fzJy9pB0qll0FPcOuDhCRl3ubEvwOYWUyXXb5YoZ1X7GqMHSfZq7bNmWxuQUki5XnDdc+n4EPoUQiiabSzFnejKl7TJOY7IJid/iaXJ7fESIFfCNas+9zQNMc05zHnjIPctKx/mrA9egflCJGLd5eDFXukGWdddQYU+95PlDWVE97GXPeS+oivf6saBZCKHoM+8+cvcQ2NyhOwMmfW4SxdgTNs9oZd0tBAEhsRDfJbcvgbIPKTtOnNzlPnECAkPWP8xsTv3ZrJ1v2UfmuKDqGRt5QgjZ9kDWyd5D1iioP1U4P3KzqZYYY5v0om38rpDpIeCHrUFMCPjPEeSE/COetf3SU/i7EEL2GVUdSjXkGfGBfWDzIFsb/q93dRizU2R7yDr+o09R/GfRzsmRrSGvFRcihgsRw4WI4ULEcCFiuBAxXIgYLkQMFyKGCxHDhYjhQsRwIWK4EDFciBguRAwXIoYLEcOFiOFCxHAhYrgQMf4CVuqCm+17t3sAAAAASUVORK5CYII=);
  183. background-size: 50px 44px;
  184. -ms-touch-action: auto;
  185. }
  186. </style>
  187. </head>
  188. <body>
  189. <br/>
  190. <div class="button" onclick="getImage()">拍照</div>
  191. <div class="button" onclick="getVideo()">录像</div>
  192. <br/>
  193. <!-- History list -->
  194. <ul id="history" class="dlist" style="text-align:left;">
  195. <li id="empty" class="ditem-empty">无历史记录</li>
  196. </ul>
  197. <br/>
  198. <div class="button button-waring" onclick="cleanHistory()">清空历史记录</div>
  199. <br/>
  200. <div id="outpos"/>
  201. <div id="output">
  202. Camera管理摄像头设备,可用于拍摄照片、录制视频文件。
  203. </div>
  204. </body>
  205. </html>