/*
* Copyright (C) 2008 ZXing authors
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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 com.uperone.zxing.camera;
import java.io.IOException;
import android.content.Context;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.Camera;
import android.os.Build;
import android.os.Handler;
import android.util.Log;
import android.view.SurfaceHolder;
/**
* This object wraps the Camera service object and expects to be the only one
* talking to it. The implementation encapsulates the steps needed to take
* preview-sized images, which are used for both preview and decoding.
*
* @author dswitkin@google.com (Daniel Switkin)
*/
@SuppressWarnings("deprecation")
public final class CameraManager {
static final int SDK_INT; // Later we can use Build.VERSION.SDK_INT
static {
int sdkInt;
try {
sdkInt = Integer.parseInt(Build.VERSION.SDK);
} catch (NumberFormatException nfe) {
// Just to be safe
sdkInt = 10000;
}
SDK_INT = sdkInt;
}
/**
* Initializes this static object with the Context of the calling Activity.
*
* @param context
* The Activity which wants to use the camera.
*/
public static void init(Context context) {
if (mCameraManager == null) {
mCameraManager = new CameraManager(context);
}
}
/**
* Gets the CameraManager singleton instance.
*
* @return A reference to the CameraManager singleton.
*/
public static CameraManager get() {
return mCameraManager;
}
private CameraManager(Context context) {
mConfigManager = new CameraConfigurationManager(context);
// Camera.setOneShotPreviewCallback() has a race condition in Cupcake,
// so we use the older
// Camera.setPreviewCallback() on 1.5 and earlier. For Donut and later,
// we need to use
// the more efficient one shot callback, as the older one can swamp the
// system and cause it
// to run out of memory. We can't use SDK_INT because it was introduced
// in the Donut SDK.
// useOneShotPreviewCallback = Integer.parseInt(Build.VERSION.SDK) >
// Build.VERSION_CODES.CUPCAKE;
mUseOneShotPreviewCallback = Integer.parseInt(Build.VERSION.SDK) > 3;
mPreviewCallback = new PreviewCallback(mConfigManager, mUseOneShotPreviewCallback);
mAutoFocusCallback = new AutoFocusCallback();
}
/**
* Opens the camera driver and initializes the hardware parameters.
*
* @param holder
* The surface object which the camera will draw preview frames
* into.
* @throws IOException
* Indicates the camera driver failed to open.
*/
public void openDriver(SurfaceHolder holder) throws IOException {
if (camera == null) {
camera = Camera.open();
if (camera == null) {
throw new IOException();
}
camera.setPreviewDisplay(holder);
if (!mInitialized) {
mInitialized = true;
mConfigManager.initFromCameraParameters(camera);
}
mConfigManager.setDesiredCameraParameters(camera);
FlashlightManager.enableFlashlight();
}
}
/**
* Closes the camera driver if still in use.
*/
public void closeDriver() {
if (camera != null) {
FlashlightManager.disableFlashlight();
camera.release();
camera = null;
}
}
/**
* Asks the camera hardware to begin drawing preview frames to the screen.
*/
public void startPreview() {
if (camera != null && !mPreviewing) {
camera.startPreview();
mPreviewing = true;
}
}
/**
* Tells the camera to stop drawing preview frames.
*/
public void stopPreview() {
if (camera != null && mPreviewing) {
if (!mUseOneShotPreviewCallback) {
camera.setPreviewCallback(null);
}
camera.stopPreview();
mPreviewCallback.setHandler(null, 0);
mAutoFocusCallback.setHandler(null, 0);
mPreviewing = false;
}
}
/**
* A single preview frame will be returned to the handler supplied. The data
* will arrive as byte[] in the message.obj field, with width and height
* encoded as message.arg1 and message.arg2, respectively.
*
* @param handler
* The handler to send the message to.
* @param message
* The what field of the message to be sent.
*/
public void requestPreviewFrame(Handler handler, int message) {
if (camera != null && mPreviewing) {
mPreviewCallback.setHandler(handler, message);
if (mUseOneShotPreviewCallback) {
camera.setOneShotPreviewCallback(mPreviewCallback);
} else {
camera.setPreviewCallback(mPreviewCallback);
}
}
}
/**
* Asks the camera hardware to perform an autofocus.
*
* @param handler
* The Handler to notify when the autofocus completes.
* @param message
* The message to deliver.
*/
public void requestAutoFocus(Handler handler, int message) {
if (camera != null && mPreviewing) {
mAutoFocusCallback.setHandler(handler, message);
// Log.d(TAG, "Requesting auto-focus callback");
camera.autoFocus(mAutoFocusCallback);
}
}
/**
* Calculates the framing rect which the UI should draw to show the user
* where to place the barcode. This target helps with alignment as well as
* forces the user to hold the device far enough away to ensure the image
* will be in focus.
*
* @return The rectangle to draw on screen in window coordinates.
*/
public Rect getFramingRect() {
Point screenResolution = mConfigManager.getScreenResolution();
if (mFramingRect == null) {
if (camera == null) {
return null;
}
int width = screenResolution.x * 3 / 4;
if (width < MIN_FRAME_WIDTH) {
width = MIN_FRAME_WIDTH;
} else if (width > MAX_FRAME_WIDTH) {
width = MAX_FRAME_WIDTH;
}
int height = screenResolution.y * 3 / 4;
if (height < MIN_FRAME_HEIGHT) {
height = MIN_FRAME_HEIGHT;
} else if (height > MAX_FRAME_HEIGHT) {
height = MAX_FRAME_HEIGHT;
}
int leftOffset = (screenResolution.x - width) / 2;
int topOffset = (screenResolution.y - height) / 2;
mFramingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);
Log.d(TAG, "Calculated framing rect: " + mFramingRect);
}
return mFramingRect;
}
/**
* Like {@link #getFramingRect} but coordinates are in terms of the preview
* frame, not UI / screen.
*/
public Rect getFramingRectInPreview() {
if (mFramingRectInPreview == null) {
Rect rect = new Rect(getFramingRect());
Point cameraResolution = mConfigManager.getCameraResolution();
Point screenResolution = mConfigManager.getScreenResolution();
rect.left = rect.left * cameraResolution.x / screenResolution.x;
rect.right = rect.right * cameraResolution.x / screenResolution.x;
rect.top = rect.top * cameraResolution.y / screenResolution.y;
rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;
mFramingRectInPreview = rect;
}
return mFramingRectInPreview;
}
/**
* Converts the result points from still resolution coordinates to screen
* coordinates.
*
* @param points
* The points returned by the Reader subclass through
* Result.getResultPoints().
* @return An array of Points scaled to the size of the framing rect and
* offset appropriately so they can be drawn in screen coordinates.
*/
/*
* public Point[] convertResultPoints(ResultPoint[] points) { Rect frame =
* getFramingRectInPreview(); int count = points.length; Point[] output =
* new Point[count]; for (int x = 0; x < count; x++) { output[x] = new
* Point(); output[x].x = frame
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
ShareWifi.rar (88个子文件)
ShareWifi
bin
classes.dex 547KB
res
drawable-ldpi
icon.png 2KB
drawable-hdpi
icon.png 4KB
drawable-mdpi
icon.png 2KB
ShareWifi.apk 226KB
dexedLibs
zxing-7a98f880acd424606c8c99b827470d0d.jar 179KB
classes
com
uperone
wifi
WifiAdmin.class 10KB
UserWifiInfo.class 400B
zxing
BuildConfig.class 343B
R$layout.class 502B
R$id.class 1KB
R$drawable.class 397B
camera
FlashlightManager.class 4KB
PreviewCallback.class 2KB
PlanarYUVLuminanceSource.class 3KB
AutoFocusCallback.class 2KB
CameraManager.class 6KB
CameraConfigurationManager.class 7KB
view
ViewfinderView.class 4KB
ViewfinderResultPointCallback.class 808B
R$attr.class 337B
R.class 614B
ui
MainActivity.class 1KB
CaptureActivity.class 7KB
BaseActivity.class 710B
CaptureActivity$1.class 848B
GenerateActivity.class 8KB
R$string.class 395B
R$color.class 1KB
decoding
InactivityTimer.class 2KB
Intents$Share.class 500B
Intents.class 675B
Intents$SearchBookContents.class 607B
Intents$Scan.class 873B
BitmapLuminanceSource.class 1KB
Intents$Encode.class 628B
InactivityTimer$DaemonThreadFactory.class 939B
DecodeHandler.class 4KB
CaptureActivityHandler.class 4KB
FinishListener.class 1KB
DecodeThread.class 3KB
DecodeFormatManager.class 4KB
CaptureActivityHandler$State.class 1KB
Intents$WifiConnect.class 607B
R$raw.class 382B
resources.ap_ 22KB
AndroidManifest.xml 2KB
res
drawable-ldpi
icon.png 2KB
raw
beep.ogg 6KB
drawable-hdpi
icon.png 4KB
values
colors.xml 1KB
strings.xml 111B
ids.xml 573B
drawable-mdpi
icon.png 3KB
layout
activity_capture_layout.xml 749B
activity_generate_layout.xml 729B
activity_main_layout.xml 875B
gen
com
uperone
zxing
BuildConfig.java 159B
R.java 3KB
proguard.cfg 1KB
.settings
org.eclipse.jdt.core.prefs 177B
src
com
uperone
wifi
WifiAdmin.java 10KB
UserWifiInfo.java 120B
zxing
camera
CameraManager.java 10KB
PlanarYUVLuminanceSource.java 4KB
FlashlightManager.java 5KB
CameraConfigurationManager.java 8KB
PreviewCallback.java 2KB
AutoFocusCallback.java 2KB
view
ViewfinderView.java 6KB
ViewfinderResultPointCallback.java 1KB
ui
GenerateActivity.java 6KB
MainActivity.java 867B
CaptureActivity.java 5KB
BaseActivity.java 530B
decoding
Intents.java 6KB
DecodeHandler.java 3KB
InactivityTimer.java 2KB
FinishListener.java 1KB
CaptureActivityHandler.java 4KB
DecodeThread.java 3KB
BitmapLuminanceSource.java 1KB
DecodeFormatManager.java 4KB
.project 845B
.classpath 512B
project.properties 563B
AndroidManifest.xml 2KB
libs
zxing.jar 420KB
共 88 条
- 1
资源评论
- wilk20072015-04-17自己写了个下载来看看别人的实现...zxing
- txljfn2017-03-30手机需要root权限,不然没法使用
- 大白菜小萝卜2019-10-25还可以,但分数要高了。
- ekqhero2015-08-20挺简单的demo,看得懂
张明云
- 粉丝: 271
- 资源: 51
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功