展会信息港展会大全

Rexsee写的Android平台上的Camera功能
来源:互联网   发布日期:2015-09-29 10:05:38   浏览:1831次  

导读:Android的Camera包含取景(preview)和拍摄照片(take picture)的功能。其实Camera的功能还是比较简单,只是需要注意其架构分成客户端和服务器两个部分,它们建立在Android的进程间通讯Binder的结构上。这里分......

Android的Camera包含取景(preview)和拍摄照片(take picture)的功能。其实Camera的功能还是比较简单,只是需要注意其架构分成客户端和服务器两个部分,它们建立在Android的进程间通讯Binder的结构上。

这里分享的是基于Rexsee实现的原生Camera拍摄功能,关于Preview部分可以在Rexsee的社区里找到源码。

开源的,虽然貌似现在还没完全对外下载,但可以自己整理下来看,我就是这样做的:http://www.rexsee.com/

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 Camera

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港