"不幸的是,应用程序的名称已经停止&QUOT。 Android设备或模拟器的是、模拟器、应用程序、不幸

2023-09-07 09:19:20 作者:特别漫长

我是新的android开发,我下面的一些教程创建第一个应用程序。 当我想要运行的应用程序,编译器显示没有错误,但在仿真器显示不幸的是,取景器布拉布拉已经停止。

在code:

AndroidManifest.xml文件

 <舱单的xmlns:机器人=htt​​p://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/>
    <使用-权限的Andr​​oid:名称=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 ...更多
 
windows资源管理器总是停止工作 问题签名 问题事件名称 BEX 应用程序名 Explorer.EXE 应用程序版本 6.

解决方案

您需要有的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.