1

我有一个应用程序,它是一个手电筒。我添加了一个功能,如果用户在设备中没有闪光灯,那么它应该启动一个前置屏幕手电筒。这是我的代码..

LightsOn.java

public class LightsOn extends Activity implements OnKeyListener
{
ImageView button;
Boolean flashon=true;
private boolean hasFlash;
Parameters myparas;
private Camera mycamera;

@Override
protected void onCreate(Bundle savedInstanceState) 
{

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_light);


    hasFlash = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);

    button=(ImageView)findViewById(R.id.power);
    button.setBackgroundResource(R.drawable.offswitch);
    button.setOnClickListener(new View.OnClickListener() 
    {

        @Override
        public void onClick(View v) 
        {
            // TODO Auto-generated method stub
            if(flashon)
            {
                button.setBackgroundResource(R.drawable.onswitch);
                if (mycamera == null || myparas == null) 
                    {
                        return;
                    }
                else
                    {
                    myparas = mycamera.getParameters();
                    myparas.setFlashMode(Parameters.FLASH_MODE_OFF);
                    mycamera.setParameters(myparas);
                    mycamera.stopPreview();
                    flashon=false;
                    }
            }
            else
            {
                button.setBackgroundResource(R.drawable.offswitch);
                 if (mycamera == null || myparas == null) 
                    {
                        return;
                    }
                 else
                    {
                    myparas = mycamera.getParameters();
                    myparas.setFlashMode(Parameters.FLASH_MODE_TORCH);
                    mycamera.setParameters(myparas);
                    mycamera.startPreview();
                    flashon=true;
                    }
            }
        }
    });

}

     private void getCamera() 
        {
            if (mycamera == null) 
            {
                try 
                {
                    mycamera = Camera.open();
                    myparas = mycamera.getParameters();
                } 
                catch (RuntimeException e)
                {
                    Log.e("Camera Error. Failed to Open. Error: ", e.getMessage());
                }
            }



    if (!hasFlash)
    {
        AlertDialog.Builder dialog = new AlertDialog.Builder(this);
        dialog.setTitle("Sorry your device doesnt support flash. Do you want to use your front screen as torch.?");
        dialog.setMessage("Press 'OKAY' to exit..");
        dialog.setPositiveButton("Use screen", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) 
           {
               Intent intent = new Intent(LightsOn.this,FrontScreen.class);
               startActivity(intent);
           }
        });
        dialog.setNegativeButton("More Apps by AKSHAT JAISWAL", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) 
               {
                    String page="https://play.google.com/store/apps/developer?id=Akshat+Jaiswal#?t=W251bGwsbnVsbCxudWxsLDEsImFrc2hhdC5qYWlzd2FsLnNob3dtZXRoYXRhcHAiXQ..";
                    Intent newIntent= new Intent();
                    newIntent.setAction(Intent.ACTION_VIEW);
                    newIntent.setData(android.net.Uri.parse(page));
                    Uri.parse(page);
                    startActivity(newIntent);
                    finish();
                    moveTaskToBack(true);
               }
            });
        dialog.setNeutralButton("Exit", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) 
               {
                   finish();
                   moveTaskToBack(true);
               }
            });


        dialog.show();
    }


}



     @Override
        protected void onDestroy() {
            super.onDestroy();
        }

        @Override
        protected void onPause()
        {
            super.onPause();
        }

        @Override
        protected void onRestart() {
            super.onRestart();
        }

        @Override
        protected void onResume() {
            super.onResume();    

            if(hasFlash)
            myparas = mycamera.getParameters();
            myparas.setFlashMode(Parameters.FLASH_MODE_TORCH);
            mycamera.setParameters(myparas);
            mycamera.startPreview();
            flashon=true;
        }

         @Override
             protected void onStop()
         {
             super.onStop();
         }


         @Override
             protected void onStart() {
             super.onStart();
             // on starting the app get the camera params
             getCamera();
                }

 @Override
    public boolean onCreateOptionsMenu(Menu m)
    {
        MenuInflater inf=getMenuInflater(); 
        inf.inflate(R.menu.menu,m);
        return true;

    }

    public boolean onOptionsItemSelected(MenuItem itm)
    {

        if(itm.getItemId()==R.id.it1)
        {

            if(flashon)
            {
                button.setBackgroundResource(R.drawable.onswitch);
                if (mycamera == null || myparas == null) 
                    {
                        return false;
                    }
                else
                    {
                    myparas = mycamera.getParameters();
                    myparas.setFlashMode(Parameters.FLASH_MODE_OFF);
                    mycamera.setParameters(myparas);
                    mycamera.stopPreview();
                    flashon=false;
                    }
            }
            else
            {
                button.setBackgroundResource(R.drawable.offswitch);
                 if (mycamera == null || myparas == null) 
                    {
                        return false;
                    }
                 else
                    {
                    myparas = mycamera.getParameters();
                    myparas.setFlashMode(Parameters.FLASH_MODE_TORCH);
                    mycamera.setParameters(myparas);
                    mycamera.startPreview();
                    flashon=true;
                    }
            }


        }


        else if(itm.getItemId()==R.id.it2)
        {
            Intent intent = new Intent(LightsOn.this,FrontScreen.class);
            startActivity(intent);
        }


        else if(itm.getItemId()==R.id.it3)
        {
            Toast.makeText(getApplicationContext(), "Website getting launched soon..!!", Toast.LENGTH_SHORT).show();
            //String page="http://www.akshatjaiswal.in";
            //Intent newIntent= new Intent();
            //newIntent.setAction(Intent.ACTION_VIEW);
            //newIntent.setData(android.net.Uri.parse(page));
            //Uri.parse(page);
            //startActivity(newIntent);
        }

        else if(itm.getItemId()==R.id.it4)
        {
            String page="https://play.google.com/store/apps/developer?id=Akshat+Jaiswal#?t=W251bGwsbnVsbCxudWxsLDEsImFrc2hhdC5qYWlzd2FsLnNob3dtZXRoYXRhcHAiXQ..";
            Intent newIntent= new Intent();
            newIntent.setAction(Intent.ACTION_VIEW);
            newIntent.setData(android.net.Uri.parse(page));
            Uri.parse(page);
            startActivity(newIntent);
        }

        else if(itm.getItemId()==R.id.it5)
        {

            openDialog();
        }       
        return true;    
        }

    private void openDialog(){
        final Dialog dialog = new Dialog(LightsOn.this);
        dialog.setTitle("Thank You..");
        dialog.setContentView(R.layout.dialoglayout);
        dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
        Button btnDismiss = (Button)dialog.getWindow().findViewById(R.id.exit);
        Button btnCancel = (Button)dialog.getWindow().findViewById(R.id.cancel);


        btnDismiss.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v) 
            {
                if(flashon)
                {
                    button.setBackgroundResource(R.drawable.onswitch);
                    if (mycamera == null || myparas == null) 
                        {
                            return;
                        }
                    else
                        {
                        myparas = mycamera.getParameters();
                        myparas.setFlashMode(Parameters.FLASH_MODE_OFF);
                        mycamera.setParameters(myparas);
                        mycamera.stopPreview();
                        mycamera.release();
                        finish();
                        moveTaskToBack(true);
                        }
                }
                else
                {
                    myparas = mycamera.getParameters();
                    myparas.setFlashMode(Parameters.FLASH_MODE_OFF);
                    mycamera.setParameters(myparas);
                    mycamera.stopPreview();
                    mycamera.release();
                finish();
               moveTaskToBack(true);
                }
            }});

        btnCancel.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }});

        dialog.show();
    }


    @Override
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void onBackPressed() 
    {
        // TODO Auto-generated method stub
        super.onBackPressed();

        myparas = mycamera.getParameters();
        myparas.setFlashMode(Parameters.FLASH_MODE_OFF);
        mycamera.setParameters(myparas);
        mycamera.stopPreview();
        flashon = false;

        if (mycamera != null) {
            mycamera.release();
            mycamera = null;
        }
        Log.d("Camera","Back Pressed");
    }

}

现在如果用户没有flash,那么这个类将被启动。

FrontScreen.java

public class FrontScreen extends Activity
{
Boolean torchon=false;
ImageView button;
RelativeLayout lyt;

@Override
protected void onCreate(Bundle savedInstanceState) 
{

    super.onCreate(savedInstanceState);
    setContentView(R.layout.frontscreen);

    lyt=(RelativeLayout)findViewById(R.id.layout);
    button=(ImageView)findViewById(R.id.power);
    button.setOnClickListener(new View.OnClickListener() 
    {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(torchon)
            {
            lyt.setBackgroundResource(R.drawable.background);
            torchon=false;
            }
            else
            {
            lyt.setBackgroundResource(R.drawable.fronttorch);
            torchon=true;
            }

        }
    });



}


     @Override
        public boolean onCreateOptionsMenu(Menu m)
        {
            MenuInflater inf=getMenuInflater(); 
            inf.inflate(R.menu.frontmenu,m);
            return true;

        }

        public boolean onOptionsItemSelected(MenuItem itm)
        {

            if(itm.getItemId()==R.id.it1)
            {

                if(torchon)
                {
                    lyt.setBackgroundResource(R.drawable.background);
                    torchon=false;
                }
                else
                {
                    lyt.setBackgroundResource(R.drawable.fronttorch);
                    torchon=true;
                }


            }


            **else if(itm.getItemId()==R.id.it2)
            {
                Intent intents = new Intent(FrontScreen.this,LightsOn.class);
                startActivity(intents);
            }**


            else if(itm.getItemId()==R.id.it3)
            {
                Toast.makeText(getApplicationContext(), "Website getting launched soon..!!", Toast.LENGTH_SHORT).show();

            }

            else if(itm.getItemId()==R.id.it4)
            {

            }

            else if(itm.getItemId()==R.id.it5)
            {

                openDialog();
            }       
            return true;    
            }

        private void openDialog(){
            final Dialog dialog = new Dialog(FrontScreen.this);
            dialog.setTitle("Thank You..");
            dialog.setContentView(R.layout.dialoglayout);
            dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
            Button btnDismiss = (Button)dialog.getWindow().findViewById(R.id.exit);
            Button btnCancel = (Button)dialog.getWindow().findViewById(R.id.cancel);
            btnDismiss.setOnClickListener(new OnClickListener()
            {

                @Override
                public void onClick(View v) 
                {
                    if(torchon)
                    {
                    lyt.setBackgroundResource(R.drawable.background);
                    }
                    else
                    {
                    finish();
                    moveTaskToBack(true);
                    }
                }});

            btnCancel.setOnClickListener(new OnClickListener(){

                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }});

            dialog.show();
        }


}

现在,当我从这个类中回调第一个类时,它位于选项菜单项 2 中,它显示 NullPointerException..

这是我的 logcat 消息

 07-10 13:27:40.111: W/dalvikvm(17187): threadid=1: thread exiting with uncaught     exception (group=0x4104e258)
 07-10 13:27:40.115: E/AndroidRuntime(17187): FATAL EXCEPTION: main
 07-10 13:27:40.115: E/AndroidRuntime(17187): java.lang.RuntimeException: Unable to resume activity {akshat.jaiswal.showmethatapp/akshat.jaiswal.showmethatapp.LightsOn}:     java.lang.NullPointerException
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2595)
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2623)
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2109)
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at android.app.ActivityThread.access$600(ActivityThread.java:134)
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at android.os.Handler.dispatchMessage(Handler.java:99)
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at android.os.Looper.loop(Looper.java:154)
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at android.app.ActivityThread.main(ActivityThread.java:4624)
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at java.lang.reflect.Method.invokeNative(Native Method)
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at java.lang.reflect.Method.invoke(Method.java:511)
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at dalvik.system.NativeStart.main(Native Method)
 07-10 13:27:40.115: E/AndroidRuntime(17187): Caused by: java.lang.NullPointerException
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at akshat.jaiswal.showmethatapp.LightsOn.onResume(LightsOn.java:169)
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1159)
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at android.app.Activity.performResume(Activity.java:4553)
 07-10 13:27:40.115: E/AndroidRuntime(17187):   at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2581)
 07-10 13:27:40.115: E/AndroidRuntime(17187):   ... 12 more

谁能帮帮我.. 提前谢谢。

4

1 回答 1

0

只是一个猜测。如果设置了标志,则onResume似乎执行了代码。hasFlash如果是这样,onResume 应该是这样的

@Override
protected void onResume() {
    super.onResume();    

    if(hasFlash){
        myparas = mycamera.getParameters();
        myparas.setFlashMode(Parameters.FLASH_MODE_TORCH);
        mycamera.setParameters(myparas);
        mycamera.startPreview();
        flashon=true;
    }
}
于 2013-07-10T08:04:48.983 回答