Rexsee API介绍:Android照片、视频拍摄,Camera扩展

本文详细介绍了Rexsee Camera API 的核心功能,包括拍照、录像和上传操作,通过示例代码展示了如何使用API进行图片和视频的拍摄与上传,并提供了一个用于查看拍摄文件的HTML界面。
Android的Camera包含取景(preview)和拍摄照片(take picture)的功能。其实Camera的功能还是比较简单,只是需要注意其架构分成客户端和服务器两个部分,它们建立在Android的进程间通讯Binder的结构上。

Rexsee的扩展中除了对于Camera的支持,同时还可结合外部的一些开源代码实现对照片的快速处理,可以实现类似于美图秀秀、Camera360等的效果。。关于一些具体的应用Demo可以在Rexsee项目中心查阅: http://www.rexsee.com/project/index.php

【函数】 void takePicture()
【函数】 void takePicture(int quality)
【说明】 拍摄照片。拍摄成功触发事件onTakePictureSuccessed,失败则触发onTakePictureFailed。
【返回】
【参数】 quality:0表示较低质量,1表示较高质量,为方便上传,默认为0。
【示例】
rexseeCamera.takePicture();

【函数】 void takeVideo()
【函数】 void takeVideo(int quality)
【说明】 拍摄视频。拍摄成功触发事件onTakeVideoSuccessed,失败则触发onTakeVideoFailed。
【返回】
【参数】 quality:0表示较低质量,1表示较高质量,为方便上传,默认为0。
【示例】
rexseeCamera.takeVideo();

【函数】 void upload(String action,String name)
【说明】 将拍摄好的照片或视频直接上传。通常在onTakePictureSuccessed或onTakeVideoSuccessed事件中调用。
【返回】
【参数】 action:上传的服务器程序url,等同于HTML中<form action="......">中的action。 
name:上传名称,等同于HTML中<input type="file" name="......">中的name。 
action指向的服务器程序和HTML中表单对应的程序相同,示例的服务器程序参见rexseeUpload对象。

rexseeCamera.java源码
/* 
* Copyright (C) 2011 The Rexsee Open Source Project 
* 
* Licensed under the Rexsee License, Version 1.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*      http://www.rexsee.com/CN/legal/license.html 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 
 
package rexsee.multimedia;  
 
import rexsee.core.browser.ActivityResult.ActivityResultListener;  
import rexsee.core.browser.JavascriptInterface;  
import rexsee.core.browser.RexseeBrowser;  
import rexsee.core.browser.UrlListener;  
import rexsee.core.lang.RexseeLanguage;  
import rexsee.core.transportation.RexseeUpload;  
import android.app.Activity;  
import android.content.ContentResolver;  
import android.content.Context;  
import android.content.Intent;  
import android.database.Cursor;  
import android.net.Uri;  
import android.provider.MediaStore;  
 
public class RexseeCamera implements JavascriptInterface {  
 
       private static final String INTERFACE_NAME = "Camera";  
       @Override  
       public String getInterfaceName() {  
               return mBrowser.application.resources.prefix + INTERFACE_NAME;  
       }  
       @Override  
       public JavascriptInterface getInheritInterface(RexseeBrowser childBrowser) {  
               return this;  
       }  
       @Override  
       public JavascriptInterface getNewInterface(RexseeBrowser childBrowser) {  
               return new RexseeCamera(childBrowser);  
       }  
 
       public static final String EVENT_ONTAKEPICTURESUCCESSED = "onTakePictureSuccessed";  
       public static final String EVENT_ONTAKEPICTUREFAILED = "onTakePictureFailed";  
       public static final String EVENT_ONTAKEVIDEOSUCCESSED = "onTakeVideoSuccessed";  
       public static final String EVENT_ONTAKEVIDEOFAILED = "onTakeVideoFailed";  
 
       public static final String URI_MEDIA_IMAGE = "content://media/external/images/media";  
       public static final String URI_MEDIA_VIDEO = "content://media/external/video/media";  
 
       private String mediaFile = null;  
 
       private final RexseeBrowser mBrowser;  
       public RexseeCamera(RexseeBrowser browser) {  
 
               mBrowser = browser;  
               browser.eventList.add(EVENT_ONTAKEPICTURESUCCESSED);  
               browser.eventList.add(EVENT_ONTAKEPICTUREFAILED);  
               browser.eventList.add(EVENT_ONTAKEVIDEOSUCCESSED);  
               browser.eventList.add(EVENT_ONTAKEVIDEOFAILED);  
 
               browser.urlListeners.add(new UrlListener(mBrowser.application.resources.prefix + ":images") {  
                       @Override  
                       public void run(Context context, final RexseeBrowser browser, final String url) {  
                               new Thread() {  
                                       @Override  
                                       public void run() {  
                                               String html = "<HTML><HEAD><TITLE>" + url + "</TITLE></HEAD>";  
                                               html += "<BODY style='margin:0px;background-color:black;color:white;'>";  
                                               ContentResolver contentResolver = mBrowser.getContext().getContentResolver();  
                                               browser.progressDialog.show(RexseeLanguage.PROGRESS_ONGOING);  
                                               Cursor cursor = contentResolver.query(Uri.parse(URI_MEDIA_IMAGE), new String[]{"_id", "_data"}, null, null, "_id desc");  
                                               html += "<table width=100% cellspacing=0 style='color:white;font-size:16px;'>";  
                                               if (cursor.getCount() == 0) {  
                                                       html += "<tr><td style='padding:10px;'>No image found.</td></tr>";  
                                               } else {  
                                                       for (int i = 0; i < cursor.getCount(); i++) {  
                                                               cursor.moveToPosition(i);  
                                                               html += "<tr><td onclick=\"" + browser.function.getInterfaceName() + ".go('" + URI_MEDIA_IMAGE + "/" + cursor.getInt(0) + "');\" style='border-bottom:1px solid #222222; padding:10 5 10 5;word-break:break-all;'>" + cursor.getString(1) + "</td></tr>";  
                                                       }  
                                               }  
                                               cursor.close();  
                                               html += "</table>";  
                                               html += "</BODY>";  
                                               html += "</HTML>";  
                                               browser.function.loadHTMLWithoutHistory(html);  
                                       }  
                               }.start();  
                       }  
                       @Override  
                       public boolean shouldAddToHistory(Context context, RexseeBrowser browser, String url) {  
                               return true;  
                       }  
               });  
               browser.urlListeners.add(new UrlListener(mBrowser.application.resources.prefix + ":video") {  
                       @Override  
                       public void run(Context context, final RexseeBrowser browser, final String url) {  
                               new Thread() {  
                                       @Override  
                                       public void run() {  
                                               String html = "<HTML><HEAD><TITLE>" + url + "</TITLE></HEAD>";  
                                               html += "<BODY style='margin:0px;background-color:black;color:white;'>";  
                                               ContentResolver contentResolver = mBrowser.getContext().getContentResolver();  
                                               browser.progressDialog.show(RexseeLanguage.PROGRESS_ONGOING);  
                                               Cursor cursor = contentResolver.query(Uri.parse(URI_MEDIA_VIDEO), new String[]{"_id", "_data"}, null, null, "_id desc");  
                                               html += "<table width=100% cellspacing=0 style='color:white;font-size:16px;'>";  
                                               if (cursor.getCount() == 0) {  
                                                       html += "<tr><td style='padding:10px;'>No video found.</td></tr>";  
                                               } else {  
                                                       for (int i = 0; i < cursor.getCount(); i++) {  
                                                               cursor.moveToPosition(i);  
                                                               html += "<tr><td onclick=\"" + browser.function.getInterfaceName() + ".go('" + URI_MEDIA_VIDEO + "/" + cursor.getInt(0) + "');\" style='border-bottom:1px solid #222222; padding:10 5 10 5;word-break:break-all;'>" + cursor.getString(1) + "</td></tr>";  
                                                       }  
                                               }  
                                               cursor.close();  
                                               html += "</table>";  
                                               html += "</BODY>";  
                                               html += "</HTML>";  
                                               browser.function.loadHTMLWithoutHistory(html);  
                                       }  
                               }.start();  
                       }  
                       @Override  
                       public boolean shouldAddToHistory(Context context, RexseeBrowser browser, String url) {  
                               return true;  
                       }  
               });  
 
       }  
       public String getLastMediaImage() {  
               ContentResolver contentResolver = mBrowser.getContext().getContentResolver();  
               Cursor cursor = contentResolver.query(Uri.parse(URI_MEDIA_IMAGE), new String[]{"_data"}, null, null, "_id desc");  
               if (cursor == null || cursor.getCount() == 0) return null;  
               cursor.moveToFirst();  
               String rtn = "file://" + cursor.getString(0);  
               cursor.close();  
               return rtn;  
       }  
       public String getLastMediaVideo() {  
               ContentResolver contentResolver = mBrowser.getContext().getContentResolver();  
               Cursor cursor = contentResolver.query(Uri.parse(URI_MEDIA_VIDEO), new String[]{"_data"}, null, null, "_id desc");  
               if (cursor == null || cursor.getCount() == 0) return "";  
               cursor.moveToFirst();  
               String rtn = "file://" + cursor.getString(0);  
               cursor.close();  
               return rtn;  
       }  
 
       // JavaScript Interface  
 
       public void takePicture() {  
               takePicture(0);  
       }  
       public void takePicture(int quality) {  
               try {  
                       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
                       intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, (quality == 0) ? 0 : 1);  
                       mBrowser.activityResult.start(intent, new ActivityResultListener() {  
                               @Override  
                               public void run(int resultCode, Intent resultIntent) {  
                                       if (resultCode == Activity.RESULT_OK) {  
                                               mediaFile = getLastMediaImage();  
                                               mBrowser.eventList.run(EVENT_ONTAKEPICTURESUCCESSED, new String[]{mediaFile});  
                                       } else {  
                                               mediaFile = null;  
                                               mBrowser.eventList.run(EVENT_ONTAKEPICTUREFAILED);  
                                       }  
                               }  
                       });  
               } catch (Exception e) {  
                       mBrowser.exception(getInterfaceName(), e);  
               }  
       }  
 
       public void takeVideo() {  
               takeVideo(0);  
       }  
       public void takeVideo(int quality) {  
               try {  
                       Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);  
                       intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, (quality == 0) ? 0 : 1);  
                       mBrowser.activityResult.start(intent, new ActivityResultListener() {  
                               @Override  
                               public void run(int resultCode, Intent resultIntent) {  
                                       if (resultCode == Activity.RESULT_OK) {  
                                               mediaFile = getLastMediaVideo();  
                                               mBrowser.eventList.run(EVENT_ONTAKEVIDEOSUCCESSED, new String[]{mediaFile});  
                                       } else {  
                                               mediaFile = null;  
                                               mBrowser.eventList.run(EVENT_ONTAKEVIDEOFAILED);  
                                       }  
                               }  
                       });  
               } catch (Exception e) {  
                       mBrowser.exception(getInterfaceName(), e);  
               }  
       }  
 
       public void prepareUpload() {  
               if (mediaFile == null || mediaFile == "") {  
                       mBrowser.exception(getInterfaceName(), "Picture or video is not ready.");  
               } else {  
                       RexseeUpload uploadObject = (RexseeUpload) mBrowser.interfaceList.get(mBrowser.application.resources.prefix + RexseeUpload.INTERFACE_NAME);  
                       if (uploadObject == null) {  
                               mBrowser.exception(getInterfaceName(), "Upload object is not ready.");  
                       } else {  
                               uploadObject.selectedFiles.add(mediaFile);  
                       }  
               }  
       }  
 
       public void upload(String action, String name) {  
               if (mediaFile == null || mediaFile == "") {  
                       mBrowser.exception(getInterfaceName(), "Picture or video is not ready.");  
               } else {  
                       RexseeUpload uploadObject = (RexseeUpload) mBrowser.interfaceList.get(mBrowser.application.resources.prefix + RexseeUpload.INTERFACE_NAME);  
                       if (uploadObject == null) {  
                               mBrowser.exception(getInterfaceName(), "Upload object is not ready.");  
                       } else {  
                               uploadObject.clear();  
                               uploadObject.selectedFiles.add(mediaFile);  
                               uploadObject.upload(action, name);  
                       }  
               }  
       }  
 
}

仅对Rexsee的源码和函数事件做了整理,相关的demo或源码解析可以在Rexsee社区了解,目前Rexsee已提供了近2000个扩展,覆盖Android原生功能超过90%,且全部开放: http://www.rexsee.com/ 
### 如何在 Windows 系统中安装 PythonQt Designer 并配置环境 #### 安装 PyQt6 和 Qt Designer 为了在 Windows 上使用 Qt Designer,可以通过 `pip` 命令安装最新的 PyQt6 模块。PyQt6 是一个用于创建图形用户界面 (GUI) 应用程序的工具包,并附带了 Qt Designer 工具。 运行以下命令可以完成 PyQt6 及其相关组件的安装: ```bash pip install pyqt6-tools ``` 此命令会自动下载并安装必要的依赖项,其中包括 Qt Designer[^1]。 #### 配置路径以便访问 Qt Designer 安装完成后,通常可以在以下目录找到 Qt Designer 文件(具体位置取决于 Python 解释器的位置): - **对于标准安装**:`C:\Users\<用户名>\AppData\Local\Programs\Python\<版本号>\Lib\site-packages\pyqt6_tools` - 或者通过脚本启动:`python -m pyqt6_designer`. 如果希望直接从文件资源管理器或桌面快捷方式打开 Qt Designer,则需将其可执行文件所在路径添加到系统的环境变量 PATH 中。操作方法如下: 1. 打开控制面板 -> 系统和安全 -> 系统 -> 高级系统设置。 2. 单击“环境变量”,在“系统变量”部分找到名为 “Path”的条目并编辑它。 3. 添加上述提到的设计工具所在的完整路径至列表末尾。 这样处理之后,在任意 CMD 终端窗口输入 designer.exe 就能调用该应用程序。 #### 测试安装成功与否 验证是否正确设置了所有内容的一个简单办法就是尝试加载设计模式本身或者利用 PyQT 创建一个小项目来看看能否正常渲染 UI 元素。下面给出一段简单的例子展示如何载入由设计师保存下来的 .ui 文件并通过 python 运行起来: ```python from PyQt6 import uic import sys from PyQt6.QtWidgets import QApplication, QMainWindow class MyUI(QMainWindow): def __init__(self): super(MyUI,self).__init__() # 加载 ui 文件 uic.loadUi('your_ui_file.ui', self) if __name__ == '__main__': app = QApplication(sys.argv) window = MyUI() window.show() try: sys.exit(app.exec()) except SystemExit: pass ``` 以上代码片段假设存在一个叫做 'your_ui_file.ui' 的文件位于当前工作目录下,它是之前通过 Qt Designer 构建出来的界面布局定义文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值