我是新的android开发,我下面的一些教程创建第一个应用程序。 当我想要运行的应用程序,编译器显示没有错误,但在仿真器显示不幸的是,取景器布拉布拉已经停止。
在code:
AndroidManifest.xml文件
<舱单的xmlns:机器人=http://schemas.android.com/apk/res/android
包=com.example.viewfinderee368
安卓版code =1
机器人:VERSIONNAME =1.0>
<应用机器人:图标=@可绘制/图标
机器人:标签=@字符串/ APP_NAME>
<活动机器人:名称=。ViewfinderEE368
机器人:标签=@字符串/ APP_NAME
机器人:screenOrientation =景观与GT;
<意向滤光器>
<作用机器人:名称=android.intent.action.MAIN/>
<类机器人:名称=android.intent.category.LAUNCHER/>
&所述; /意图滤光器>
< /活性GT;
< /用途>
<使用-SDK安卓的minSdkVersion =6/>
<使用-权限的Android:名称=android.permission.CAMERA/>
<使用特征的android:NAME =android.hardware.camera/>
<使用特征的android:NAME =android.hardware.camera.autofocus/>
< /舱单>
的src / java文件
包com.example.viewfinderee368;
进口java.io.IOException异常;
进口android.app.Activity;
进口android.content.Context;
进口android.graphics.Bitmap;
进口android.graphics.Canvas;
进口android.graphics.Color;
进口android.graphics.Paint;
进口android.graphics.Rect;
进口android.graphics.RectF;
进口android.hardware.Camera;
进口android.hardware.Camera previewCallback。
进口android.os.Bundle;
进口android.view.SurfaceHolder;
进口android.view.SurfaceView;
进口android.view.View;
进口android.view.Window;
进口android.view.WindowManager;
进口android.view.ViewGroup.LayoutParams;
// ------------------------------------------------ ----------------------
公共类ViewfinderEE368延伸活动{
私人preVIEW米preVIEW;
私人DrawOnTop mDrawOnTop;
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
//隐藏窗口标题。
getWindow()setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN)。
requestWindowFeature(Window.FEATURE_NO_TITLE);
//创建我们的preVIEW观点,并将其作为我们活动的内容。
//创建我们DrawOnTop视图。
mDrawOnTop =新DrawOnTop(本);
米preVIEW =新的preVIEW(这一点,mDrawOnTop);
的setContentView(M preVIEW);
addContentView(mDrawOnTop,新的LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
}
}
// ------------------------------------------------ ----------------------
类DrawOnTop扩展视图{
位图mBitmap;
涂料mPaintBlack;
涂料mPaintYellow;
涂料mPaintRed;
涂料mPaintGreen;
涂料mPaintBlue;
byte []的mYUVData;
INT [] mRGBData;
INT mImageWidth,mImageHeight;
INT [] mRedHistogram;
INT [] mGreenHistogram;
INT [] mBlueHistogram;
双[] mBinSquared;
公共DrawOnTop(上下文的背景下){
超(上下文);
mPaintBlack =新的油漆();
mPaintBlack.setStyle(Paint.Style.FILL);
mPaintBlack.setColor(Color.BLACK);
mPaintBlack.setTextSize(25);
mPaintYellow =新的油漆();
mPaintYellow.setStyle(Paint.Style.FILL);
mPaintYellow.setColor(Color.YELLOW);
mPaintYellow.setTextSize(25);
mPaintRed =新的油漆();
mPaintRed.setStyle(Paint.Style.FILL);
mPaintRed.setColor(Color.RED);
mPaintRed.setTextSize(25);
mPaintGreen =新的油漆();
mPaintGreen.setStyle(Paint.Style.FILL);
mPaintGreen.setColor(Color.GREEN);
mPaintGreen.setTextSize(25);
mPaintBlue =新的油漆();
mPaintBlue.setStyle(Paint.Style.FILL);
mPaintBlue.setColor(Color.BLUE);
mPaintBlue.setTextSize(25);
mBitmap = NULL;
mYUVData = NULL;
mRGBData = NULL;
mRedHistogram =新INT [256];
mGreenHistogram =新INT [256];
mBlueHistogram =新INT [256];
mBinSquared =新的双[256];
对于(INT斌= 0;仓< 256;仓++)
{
mBinSquared [二进制] =((双)斌)*斌;
} //斌
}
@覆盖
保护无效的OnDraw(帆布油画){
如果(mBitmap!= NULL)
{
INT canvasWidth = canvas.getWidth();
INT canvasHeight = canvas.getHeight();
INT newImageWidth = canvasWidth;
INT newImageHeight = canvasHeight;
INT MARGINWIDTH =(canvasWidth - newImageWidth)/ 2;
//转换YUV到RGB
德codeYUV420SP(mRGBData,mYUVData,mImageWidth,mImageHeight);
//绘制位图
// mBitmap.setPixels(mRGBData,0,mImageWidth,0,0,
// mImageWidth,mImageHeight);
//矩形的src =新的Rect(0,0,mImageWidth,mImageHeight);
//矩形DST =新的矩形(MARGINWIDTH,0,
// canvasWidth-MARGINWIDTH,canvasHeight);
// canvas.drawBitmap(mBitmap,SRC,DST,mPaintBlack);
//绘制黑色边框
// canvas.drawRect(0,0,MARGINWIDTH,canvasHeight,mPaintBlack);
// canvas.drawRect(canvasWidth - MARGINWIDTH,0,
// canvasWidth,canvasHeight,mPaintBlack);
//计算直方图
calculateIntensityHistogram(mRGBData,mRedHistogram,
mImageWidth,mImageHeight,0);
calculateIntensityHistogram(mRGBData,mGreenHistogram,
mImageWidth,mImageHeight,1);
calculateIntensityHistogram(mRGBData,mBlueHistogram,
mImageWidth,mImageHeight,2);
//计算平均
双imageRedMean = 0,imageGreenMean = 0,imageBlueMean = 0;
双redHistogramSum = 0,greenHistogramSum = 0,blueHistogramSum = 0;
对于(INT斌= 0;仓< 256;仓++)
{
imageRedMean + = mRedHistogram [二进制] *斌;
redHistogramSum + = mRedHistogram [二进制];
imageGreenMean + = mGreenHistogram [二进制] *斌;
greenHistogramSum + = mGreenHistogram [二进制];
imageBlueMean + = mBlueHistogram [二进制] *斌;
blueHistogramSum + = mBlueHistogram [二进制];
} //斌
imageRedMean / = redHistogramSum;
imageGreenMean / = greenHistogramSum;
imageBlueMean / = blueHistogramSum;
//计算二阶矩
双imageRed2ndMoment = 0,imageGreen2ndMoment = 0,imageBlue2ndMoment = 0;
对于(INT斌= 0;仓< 256;仓++)
{
imageRed2ndMoment + = mRedHistogram [二进制] * mBinSquared [二进制];
imageGreen2ndMoment + = mGreenHistogram [二进制] * mBinSquared [二进制];
imageBlue2ndMoment + = mBlueHistogram [二进制] * mBinSquared [二进制];
} //斌
imageRed2ndMoment / = redHistogramSum;
imageGreen2ndMoment / = greenHistogramSum;
imageBlue2ndMoment / = blueHistogramSum;
双imageRedStdDev =的Math.sqrt(imageRed2ndMoment - imageRedMean * imageRedMean);
双imageGreenStdDev =的Math.sqrt(imageGreen2ndMoment - imageGreenMean * imageGreenMean);
双imageBlueStdDev =的Math.sqrt(imageBlue2ndMoment - imageBlueMean * imageBlueMean);
//绘制平均
串imageMeanStr =平均数(R,G,B):+的String.Format(。%4克,imageRedMean)+,+的String.Format(%4克。,imageGreenMean)+,+串.format(。%4克,imageBlueMean);
canvas.drawText(imageMeanStr,MARGINWIDTH + 10-1,30-1,mPaintBlack);
canvas.drawText(imageMeanStr,MARGINWIDTH + 10 + 1,30-1,mPaintBlack);
canvas.drawText(imageMeanStr,MARGINWIDTH + 10 + 1,30 + 1,mPaintBlack);
canvas.drawText(imageMeanStr,MARGINWIDTH + 10-1,30 + 1,mPaintBlack);
canvas.drawText(imageMeanStr,MARGINWIDTH + 10,30,mPaintYellow);
//绘制标准偏差
串imageStdDevStr =标准偏差(R,G,B):+的String.Format(。%4克,imageRedStdDev)+,+的String.Format(。%4克,imageGreenStdDev)+,+的String.Format(。%4克,imageBlueStdDev);
canvas.drawText(imageStdDevStr,MARGINWIDTH + 10-1,60-1,mPaintBlack);
canvas.drawText(imageStdDevStr,MARGINWIDTH + 10 + 1,60-1,mPaintBlack);
canvas.drawText(imageStdDevStr,MARGINWIDTH + 10 + 1,60 + 1,mPaintBlack);
canvas.drawText(imageStdDevStr,MARGINWIDTH + 10-1,60 + 1,mPaintBlack);
canvas.drawText(imageStdDevStr,MARGINWIDTH + 10,60,mPaintYellow);
//绘制红色强度直方图
浮barMaxHeight = 3000;
浮动barWidth =((浮点)newImageWidth)/ 256;
浮barMarginHeight = 2;
RectF barRect =新RectF();
barRect.bottom = canvasHeight - 200;
barRect.left = MARGINWIDTH;
barRect.right = barRect.left + barWidth;
对于(INT斌= 0;仓< 256;仓++)
{
浮概率=(浮点)mRedHistogram [二进制] /(浮点)redHistogramSum;
barRect.top = barRect.bottom -
Math.min(80,概率* barMaxHeight) - barMarginHeight;
canvas.drawRect(barRect,mPaintBlack);
barRect.top + = barMarginHeight;
canvas.drawRect(barRect,mPaintRed);
barRect.left + = barWidth;
barRect.right + = barWidth;
} //斌
//绘制绿色强度直方图
barRect.bottom = canvasHeight - 100;
barRect.left = MARGINWIDTH;
barRect.right = barRect.left + barWidth;
对于(INT斌= 0;仓< 256;仓++)
{
barRect.top = barRect.bottom - Math.min(80,((浮点)mGreenHistogram [二进制])/((浮点)greenHistogramSum)* barMaxHeight) - barMarginHeight;
canvas.drawRect(barRect,mPaintBlack);
barRect.top + = barMarginHeight;
canvas.drawRect(barRect,mPaintGreen);
barRect.left + = barWidth;
barRect.right + = barWidth;
} //斌
//绘制蓝色强度直方图
barRect.bottom = canvasHeight;
barRect.left = MARGINWIDTH;
barRect.right = barRect.left + barWidth;
对于(INT斌= 0;仓< 256;仓++)
{
barRect.top = barRect.bottom - Math.min(80,((浮点)mBlueHistogram [二进制])/((浮点)blueHistogramSum)* barMaxHeight) - barMarginHeight;
canvas.drawRect(barRect,mPaintBlack);
barRect.top + = barMarginHeight;
canvas.drawRect(barRect,mPaintBlue);
barRect.left + = barWidth;
barRect.right + = barWidth;
} //斌
if语句} //结束
super.onDraw(画布);
} //结束的OnDraw方法
静态公共无效去codeYUV420SP(INT [] RGB,byte []的yuv420sp,诠释的宽度,高度INT){
最终诠释框架尺寸=宽*高;
对于(INT J = 0,YP = 0; J<高度; J ++){
INT UVP =框架尺寸+(J>→1)*宽度,U = 0,V = 0;
的for(int i = 0; I<宽度;我++,YP ++){
INT Y =(0xFF的及((int)的yuv420sp [YP])) - 16;
如果(γ℃的)Y = 0;
如果((ⅰ&安培; 1)== 0){
V =(0xFF的&放大器; yuv420sp [UVP ++]) - 128;
U =(0xFF的&放大器; yuv420sp [UVP ++]) - 128;
}
INT y1192 = 1192 * Y;
INT R =(y1192 + 1634 * V);
INT G =(y1192 - 833 * V - 400 * U);
INT B =(y1192 + 2066 * U);
如果(为r 0)R = 0;否则,如果(R> 262143)R = 262143;
如果(克℃,)克= 0;否则,如果(G> 262143)G = 262143;
如果(b将0)B = 0;否则,如果(B> 262143)B = 262143;
RGB [YP] = 0xff000000 | ((为r&10 6)及为0xFF0000)| ((g取代;→2)及为0xFF00)| ((B个大于10)及0xff的);
}
}
}
静态公共无效去codeYUV420SPGrayscale(INT [] RGB,byte []的yuv420sp,诠释的宽度,高度INT)
{
最终诠释框架尺寸=宽*高;
对于(INT PIX = 0; PIX<框架尺寸; PIX ++)
{
INT pixVal =(0xFF的及((int)的yuv420sp [像素])) - 16;
如果(pixVal℃,)pixVal = 0;
如果(pixVal> 255)pixVal = 255;
RGB [像素] = 0xff000000 | (pixVal<< 16)| (pixVal&其中;&所述; 8)| pixVal;
} // PIX
}
静态公共无效calculateIntensityHistogram(INT [] RGB,INT []直方图,诠释的宽度,高度INT,INT组件)
{
对于(INT斌= 0;仓< 256;仓++)
{
直方图[二进制] = 0;
} //斌
如果(部分== 0)//红色
{
对于(INT PIX = 0; PIX<宽*高; PIX + = 3)
{
INT pixVal =(RGB [像素]≥> 16)及0xFF的;
直方图[pixVal] ++;
} // PIX
}
否则,如果(组件== 1)//绿
{
对于(INT PIX = 0; PIX<宽*高; PIX + = 3)
{
INT pixVal =(RGB [像素]≥→8)及0xFF的;
直方图[pixVal] ++;
} // PIX
}
否则//蓝
{
对于(INT PIX = 0; PIX<宽*高; PIX + = 3)
{
INT pixVal = RGB [像素]放大器; 0xFF的;
直方图[pixVal] ++;
} // PIX
}
}
}
// ------------------------------------------------ ----------------------
类preVIEW延伸SurfaceView实现SurfaceHolder.Callback {
SurfaceHolder mHolder;
相机mCamera;
DrawOnTop mDrawOnTop;
布尔mFinished;
preVIEW(上下文的背景下,DrawOnTop drawOnTop){
超(上下文);
mDrawOnTop = drawOnTop;
mFinished = FALSE;
//安装SurfaceHolder.Callback所以我们得到通知时,该
//下垫面创建和销毁。
mHolder = getHolder();
mHolder.addCallback(本);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
公共无效surfaceCreated(SurfaceHolder持有者){
mCamera = Camera.open();
尝试 {
mCamera.set previewDisplay(保持器);
// preVIEW回调时使用新的取景框可用
mCamera.set previewCallback(新previewCallback(){
在previewFrame公共无效(byte []的数据,摄像头摄像头)
{
如果((mDrawOnTop == NULL)|| mFinished)
返回;
如果(mDrawOnTop.mBitmap == NULL)
{
//初始化平局在最上层的同伴
Camera.Parameters PARAMS = camera.getParameters();
mDrawOnTop.mImageWidth = params.get previewSize()宽。
mDrawOnTop.mImageHeight = params.get previewSize()的高度。
mDrawOnTop.mBitmap = Bitmap.createBitmap(mDrawOnTop.mImageWidth,
mDrawOnTop.mImageHeight,Bitmap.Config.RGB_565);
mDrawOnTop.mRGBData =新INT [mDrawOnTop.mImageWidth * mDrawOnTop.mImageHeight]。
mDrawOnTop.mYUVData =新的字节[data.length]
}
//传递YUV数据绘制在最上层的同伴
System.arraycopy(数据,0,mDrawOnTop.mYUVData,0,data.length);
mDrawOnTop.invalidate();
}
});
}
赶上(IOException异常除外){
mCamera.release();
mCamera = NULL;
}
}
公共无效surfaceDestroyed(SurfaceHolder持有者){
//面,当我们返回将被销毁,所以停止了preVIEW。
//因为CameraDevice对象不是共享资源,这是非常
//重要的是要释放它当活动被暂停。
mFinished = TRUE;
mCamera.set previewCallback(空);
mCamera.stop preVIEW();
mCamera.release();
mCamera = NULL;
}
公共无效surfaceChanged(SurfaceHolder持有人,INT格式,INT W,INT高){
//现在的尺寸是已知的,设置相机参数,并开始
//在preVIEW。
Camera.Parameters参数= mCamera.getParameters();
parameters.set previewSize(320,240);
parameters.set previewFrameRate(15);
parameters.setSceneMode(Camera.Parameters.SCENE_MODE_NIGHT);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
mCamera.setParameters(参数);
mCamera.start preVIEW();
}
}
我试图运行在模拟器的应用程序,既与实际设备和错误是一样的。
谢谢!
编辑: LogCat中
2月11日至二十号:50:38.943:E / AndroidRuntime(614):致命异常:主要
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):java.lang.RuntimeException的:无法启动的活动ComponentInfo {com.example.viewfinderee368 / com.example.viewfinderee368.ViewfinderEE368}:android.util.AndroidRuntimeException:requestFeature ()添加内容之前,必须先调用
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在android.app.ActivityThread.access $ 600(ActivityThread.java:130)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1195)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在android.os.Handler.dispatchMessage(Handler.java:99)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在android.os.Looper.loop(Looper.java:137)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在android.app.ActivityThread.main(ActivityThread.java:4745)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在java.lang.reflect.Method.invokeNative(本机方法)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在java.lang.reflect.Method.invoke(Method.java:511)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在dalvik.system.NativeStart.main(本机方法)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):android.util.AndroidRuntimeException:产生的原因requestFeature()必须添加内容之前调用
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:215)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在android.app.Activity.requestWindowFeature(Activity.java:3225)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在com.example.viewfinderee368.ViewfinderEE368.onCreate(ViewfinderEE368.java:52)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在android.app.Activity.performCreate(Activity.java:5008)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
2月十一号日至20日:50:38.943:E / AndroidRuntime(614):11 ...更多
解决方案
您需要有的setContentView()
线旁 super.onCreate (savedInstance)
的setContentView(R.layout.your_layout_filename);
总是调用的setContentView()
初始化任何UI组件之前,否则你会得到的问题。
I'm new in android development and I'm following some tutorials to create the first apps. When I want to run the app, compiler shows no error but in Emulator shows "Unfortunately, Viewfinder blabla has stopped."
The code:
AndroidManifest.xml file
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.viewfinderee368"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:name=".ViewfinderEE368"
android:label="@string/app_name"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="6"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
</manifest>
src/.java file
package com.example.viewfinderee368;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.ViewGroup.LayoutParams;
// ----------------------------------------------------------------------
public class ViewfinderEE368 extends Activity {
private Preview mPreview;
private DrawOnTop mDrawOnTop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Hide the window title.
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// Create our Preview view and set it as the content of our activity.
// Create our DrawOnTop view.
mDrawOnTop = new DrawOnTop(this);
mPreview = new Preview(this, mDrawOnTop);
setContentView(mPreview);
addContentView(mDrawOnTop, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}
}
//----------------------------------------------------------------------
class DrawOnTop extends View {
Bitmap mBitmap;
Paint mPaintBlack;
Paint mPaintYellow;
Paint mPaintRed;
Paint mPaintGreen;
Paint mPaintBlue;
byte[] mYUVData;
int[] mRGBData;
int mImageWidth, mImageHeight;
int[] mRedHistogram;
int[] mGreenHistogram;
int[] mBlueHistogram;
double[] mBinSquared;
public DrawOnTop(Context context) {
super(context);
mPaintBlack = new Paint();
mPaintBlack.setStyle(Paint.Style.FILL);
mPaintBlack.setColor(Color.BLACK);
mPaintBlack.setTextSize(25);
mPaintYellow = new Paint();
mPaintYellow.setStyle(Paint.Style.FILL);
mPaintYellow.setColor(Color.YELLOW);
mPaintYellow.setTextSize(25);
mPaintRed = new Paint();
mPaintRed.setStyle(Paint.Style.FILL);
mPaintRed.setColor(Color.RED);
mPaintRed.setTextSize(25);
mPaintGreen = new Paint();
mPaintGreen.setStyle(Paint.Style.FILL);
mPaintGreen.setColor(Color.GREEN);
mPaintGreen.setTextSize(25);
mPaintBlue = new Paint();
mPaintBlue.setStyle(Paint.Style.FILL);
mPaintBlue.setColor(Color.BLUE);
mPaintBlue.setTextSize(25);
mBitmap = null;
mYUVData = null;
mRGBData = null;
mRedHistogram = new int[256];
mGreenHistogram = new int[256];
mBlueHistogram = new int[256];
mBinSquared = new double[256];
for (int bin = 0; bin < 256; bin++)
{
mBinSquared[bin] = ((double)bin) * bin;
} // bin
}
@Override
protected void onDraw(Canvas canvas) {
if (mBitmap != null)
{
int canvasWidth = canvas.getWidth();
int canvasHeight = canvas.getHeight();
int newImageWidth = canvasWidth;
int newImageHeight = canvasHeight;
int marginWidth = (canvasWidth - newImageWidth)/2;
// Convert from YUV to RGB
decodeYUV420SP(mRGBData, mYUVData, mImageWidth, mImageHeight);
// Draw bitmap
// mBitmap.setPixels(mRGBData, 0, mImageWidth, 0, 0,
// mImageWidth, mImageHeight);
// Rect src = new Rect(0, 0, mImageWidth, mImageHeight);
// Rect dst = new Rect(marginWidth, 0,
// canvasWidth-marginWidth, canvasHeight);
// canvas.drawBitmap(mBitmap, src, dst, mPaintBlack);
// Draw black borders
// canvas.drawRect(0, 0, marginWidth, canvasHeight, mPaintBlack);
// canvas.drawRect(canvasWidth - marginWidth, 0,
// canvasWidth, canvasHeight, mPaintBlack);
// Calculate histogram
calculateIntensityHistogram(mRGBData, mRedHistogram,
mImageWidth, mImageHeight, 0);
calculateIntensityHistogram(mRGBData, mGreenHistogram,
mImageWidth, mImageHeight, 1);
calculateIntensityHistogram(mRGBData, mBlueHistogram,
mImageWidth, mImageHeight, 2);
// Calculate mean
double imageRedMean = 0, imageGreenMean = 0, imageBlueMean = 0;
double redHistogramSum = 0, greenHistogramSum = 0, blueHistogramSum = 0;
for (int bin = 0; bin < 256; bin++)
{
imageRedMean += mRedHistogram[bin] * bin;
redHistogramSum += mRedHistogram[bin];
imageGreenMean += mGreenHistogram[bin] * bin;
greenHistogramSum += mGreenHistogram[bin];
imageBlueMean += mBlueHistogram[bin] * bin;
blueHistogramSum += mBlueHistogram[bin];
} // bin
imageRedMean /= redHistogramSum;
imageGreenMean /= greenHistogramSum;
imageBlueMean /= blueHistogramSum;
// Calculate second moment
double imageRed2ndMoment = 0, imageGreen2ndMoment = 0, imageBlue2ndMoment = 0;
for (int bin = 0; bin < 256; bin++)
{
imageRed2ndMoment += mRedHistogram[bin] * mBinSquared[bin];
imageGreen2ndMoment += mGreenHistogram[bin] * mBinSquared[bin];
imageBlue2ndMoment += mBlueHistogram[bin] * mBinSquared[bin];
} // bin
imageRed2ndMoment /= redHistogramSum;
imageGreen2ndMoment /= greenHistogramSum;
imageBlue2ndMoment /= blueHistogramSum;
double imageRedStdDev = Math.sqrt( imageRed2ndMoment - imageRedMean*imageRedMean );
double imageGreenStdDev = Math.sqrt( imageGreen2ndMoment - imageGreenMean*imageGreenMean );
double imageBlueStdDev = Math.sqrt( imageBlue2ndMoment - imageBlueMean*imageBlueMean );
// Draw mean
String imageMeanStr = "Mean (R,G,B): " + String.format("%.4g", imageRedMean) + ", " + String.format("%.4g", imageGreenMean) + ", " + String.format("%.4g", imageBlueMean);
canvas.drawText(imageMeanStr, marginWidth+10-1, 30-1, mPaintBlack);
canvas.drawText(imageMeanStr, marginWidth+10+1, 30-1, mPaintBlack);
canvas.drawText(imageMeanStr, marginWidth+10+1, 30+1, mPaintBlack);
canvas.drawText(imageMeanStr, marginWidth+10-1, 30+1, mPaintBlack);
canvas.drawText(imageMeanStr, marginWidth+10, 30, mPaintYellow);
// Draw standard deviation
String imageStdDevStr = "Std Dev (R,G,B): " + String.format("%.4g", imageRedStdDev) + ", " + String.format("%.4g", imageGreenStdDev) + ", " + String.format("%.4g", imageBlueStdDev);
canvas.drawText(imageStdDevStr, marginWidth+10-1, 60-1, mPaintBlack);
canvas.drawText(imageStdDevStr, marginWidth+10+1, 60-1, mPaintBlack);
canvas.drawText(imageStdDevStr, marginWidth+10+1, 60+1, mPaintBlack);
canvas.drawText(imageStdDevStr, marginWidth+10-1, 60+1, mPaintBlack);
canvas.drawText(imageStdDevStr, marginWidth+10, 60, mPaintYellow);
// Draw red intensity histogram
float barMaxHeight = 3000;
float barWidth = ((float)newImageWidth) / 256;
float barMarginHeight = 2;
RectF barRect = new RectF();
barRect.bottom = canvasHeight - 200;
barRect.left = marginWidth;
barRect.right = barRect.left + barWidth;
for (int bin = 0; bin < 256; bin++)
{
float prob = (float)mRedHistogram[bin] / (float)redHistogramSum;
barRect.top = barRect.bottom -
Math.min(80,prob*barMaxHeight) - barMarginHeight;
canvas.drawRect(barRect, mPaintBlack);
barRect.top += barMarginHeight;
canvas.drawRect(barRect, mPaintRed);
barRect.left += barWidth;
barRect.right += barWidth;
} // bin
// Draw green intensity histogram
barRect.bottom = canvasHeight - 100;
barRect.left = marginWidth;
barRect.right = barRect.left + barWidth;
for (int bin = 0; bin < 256; bin++)
{
barRect.top = barRect.bottom - Math.min(80, ((float)mGreenHistogram[bin])/((float)greenHistogramSum) * barMaxHeight) - barMarginHeight;
canvas.drawRect(barRect, mPaintBlack);
barRect.top += barMarginHeight;
canvas.drawRect(barRect, mPaintGreen);
barRect.left += barWidth;
barRect.right += barWidth;
} // bin
// Draw blue intensity histogram
barRect.bottom = canvasHeight;
barRect.left = marginWidth;
barRect.right = barRect.left + barWidth;
for (int bin = 0; bin < 256; bin++)
{
barRect.top = barRect.bottom - Math.min(80, ((float)mBlueHistogram[bin])/((float)blueHistogramSum) * barMaxHeight) - barMarginHeight;
canvas.drawRect(barRect, mPaintBlack);
barRect.top += barMarginHeight;
canvas.drawRect(barRect, mPaintBlue);
barRect.left += barWidth;
barRect.right += barWidth;
} // bin
} // end if statement
super.onDraw(canvas);
} // end onDraw method
static public void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) {
final int frameSize = width * height;
for (int j = 0, yp = 0; j < height; j++) {
int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
for (int i = 0; i < width; i++, yp++) {
int y = (0xff & ((int) yuv420sp[yp])) - 16;
if (y < 0) y = 0;
if ((i & 1) == 0) {
v = (0xff & yuv420sp[uvp++]) - 128;
u = (0xff & yuv420sp[uvp++]) - 128;
}
int y1192 = 1192 * y;
int r = (y1192 + 1634 * v);
int g = (y1192 - 833 * v - 400 * u);
int b = (y1192 + 2066 * u);
if (r < 0) r = 0; else if (r > 262143) r = 262143;
if (g < 0) g = 0; else if (g > 262143) g = 262143;
if (b < 0) b = 0; else if (b > 262143) b = 262143;
rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
}
}
}
static public void decodeYUV420SPGrayscale(int[] rgb, byte[] yuv420sp, int width, int height)
{
final int frameSize = width * height;
for (int pix = 0; pix < frameSize; pix++)
{
int pixVal = (0xff & ((int) yuv420sp[pix])) - 16;
if (pixVal < 0) pixVal = 0;
if (pixVal > 255) pixVal = 255;
rgb[pix] = 0xff000000 | (pixVal << 16) | (pixVal << 8) | pixVal;
} // pix
}
static public void calculateIntensityHistogram(int[] rgb, int[] histogram, int width, int height, int component)
{
for (int bin = 0; bin < 256; bin++)
{
histogram[bin] = 0;
} // bin
if (component == 0) // red
{
for (int pix = 0; pix < width*height; pix += 3)
{
int pixVal = (rgb[pix] >> 16) & 0xff;
histogram[ pixVal ]++;
} // pix
}
else if (component == 1) // green
{
for (int pix = 0; pix < width*height; pix += 3)
{
int pixVal = (rgb[pix] >> 8) & 0xff;
histogram[ pixVal ]++;
} // pix
}
else // blue
{
for (int pix = 0; pix < width*height; pix += 3)
{
int pixVal = rgb[pix] & 0xff;
histogram[ pixVal ]++;
} // pix
}
}
}
// ----------------------------------------------------------------------
class Preview extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
Camera mCamera;
DrawOnTop mDrawOnTop;
boolean mFinished;
Preview(Context context, DrawOnTop drawOnTop) {
super(context);
mDrawOnTop = drawOnTop;
mFinished = false;
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
// Preview callback used whenever new viewfinder frame is available
mCamera.setPreviewCallback(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera camera)
{
if ( (mDrawOnTop == null) || mFinished )
return;
if (mDrawOnTop.mBitmap == null)
{
// Initialize the draw-on-top companion
Camera.Parameters params = camera.getParameters();
mDrawOnTop.mImageWidth = params.getPreviewSize().width;
mDrawOnTop.mImageHeight = params.getPreviewSize().height;
mDrawOnTop.mBitmap = Bitmap.createBitmap(mDrawOnTop.mImageWidth,
mDrawOnTop.mImageHeight, Bitmap.Config.RGB_565);
mDrawOnTop.mRGBData = new int[mDrawOnTop.mImageWidth * mDrawOnTop.mImageHeight];
mDrawOnTop.mYUVData = new byte[data.length];
}
// Pass YUV data to draw-on-top companion
System.arraycopy(data, 0, mDrawOnTop.mYUVData, 0, data.length);
mDrawOnTop.invalidate();
}
});
}
catch (IOException exception) {
mCamera.release();
mCamera = null;
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
// Surface will be destroyed when we return, so stop the preview.
// Because the CameraDevice object is not a shared resource, it's very
// important to release it when the activity is paused.
mFinished = true;
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// Now that the size is known, set up the camera parameters and begin
// the preview.
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(320, 240);
parameters.setPreviewFrameRate(15);
parameters.setSceneMode(Camera.Parameters.SCENE_MODE_NIGHT);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
}
I tried to run the app both in Emulator and real device and the error was the same.
Thanks!
edit: LogCat
11-20 02:50:38.943: E/AndroidRuntime(614): FATAL EXCEPTION: main
11-20 02:50:38.943: E/AndroidRuntime(614): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.viewfinderee368/com.example.viewfinderee368.ViewfinderEE368}: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
11-20 02:50:38.943: E/AndroidRuntime(614): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
11-20 02:50:38.943: E/AndroidRuntime(614): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
11-20 02:50:38.943: E/AndroidRuntime(614): at android.app.ActivityThread.access$600(ActivityThread.java:130)
11-20 02:50:38.943: E/AndroidRuntime(614): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
11-20 02:50:38.943: E/AndroidRuntime(614): at android.os.Handler.dispatchMessage(Handler.java:99)
11-20 02:50:38.943: E/AndroidRuntime(614): at android.os.Looper.loop(Looper.java:137)
11-20 02:50:38.943: E/AndroidRuntime(614): at android.app.ActivityThread.main(ActivityThread.java:4745)
11-20 02:50:38.943: E/AndroidRuntime(614): at java.lang.reflect.Method.invokeNative(Native Method)
11-20 02:50:38.943: E/AndroidRuntime(614): at java.lang.reflect.Method.invoke(Method.java:511)
11-20 02:50:38.943: E/AndroidRuntime(614): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-20 02:50:38.943: E/AndroidRuntime(614): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-20 02:50:38.943: E/AndroidRuntime(614): at dalvik.system.NativeStart.main(Native Method)
11-20 02:50:38.943: E/AndroidRuntime(614): Caused by: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
11-20 02:50:38.943: E/AndroidRuntime(614): at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:215)
11-20 02:50:38.943: E/AndroidRuntime(614): at android.app.Activity.requestWindowFeature(Activity.java:3225)
11-20 02:50:38.943: E/AndroidRuntime(614): at com.example.viewfinderee368.ViewfinderEE368.onCreate(ViewfinderEE368.java:52)
11-20 02:50:38.943: E/AndroidRuntime(614): at android.app.Activity.performCreate(Activity.java:5008)
11-20 02:50:38.943: E/AndroidRuntime(614): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
11-20 02:50:38.943: E/AndroidRuntime(614): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
11-20 02:50:38.943: E/AndroidRuntime(614): ... 11 more
解决方案
You need to have the setContentView()
line next to super.onCreate(savedInstance)
setContentView(R.layout.your_layout_filename);
Always call setContentView()
before initializing any UI component, Otherwise you will get Issues.