Android 从活动返回后,闪光灯功能崩溃

Android 从活动返回后,闪光灯功能崩溃,android,nullpointerexception,Android,Nullpointerexception,我有一个android应用程序,它连接到mqtt代理,并监听播放/暂停铃声或打开/关闭手电筒的指令 它按预期运行,直到我更改设置并在此之后调用函数flashOnOff。然后我得到一个空指针异常,但我不明白为什么 这是我的代码(我没有包括我的导入以节省空间): public类MainActivity扩展了AppCompatActivity{ //布局相关参数 工具栏我的工具栏; 纺纱机; 图像按钮闪光灯按钮; 按键铃声; 编辑短信; //相机/手电筒相关参数 摄像机; 摄像机参数; //MQTT相

我有一个android应用程序,它连接到mqtt代理,并监听播放/暂停铃声或打开/关闭手电筒的指令

它按预期运行,直到我更改设置并在此之后调用函数flashOnOff。然后我得到一个空指针异常,但我不明白为什么

这是我的代码(我没有包括我的导入以节省空间):

public类MainActivity扩展了AppCompatActivity{
//布局相关参数
工具栏我的工具栏;
纺纱机;
图像按钮闪光灯按钮;
按键铃声;
编辑短信;
//相机/手电筒相关参数
摄像机;
摄像机参数;
//MQTT相关参数
私有字符串BrokerIp=”tcp://192.168.1.3:1883";
私有intqos=2;
静态字符串Username=“user1”;
静态字符串Password=“user1”;
字符串topicStr=“commands”;
字符串clientId=“AndroidClient”;
MqttConnectOptions选项;
MQTTandroid客户端;
振动器;
//铃声相关参数
手机铃声;
MediaPlayer ringtoneMP;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
可控震源=(可控震源)getSystemService(可控震源服务);
Uri Uri=RingtoneManager.getDefaultUri(RingtoneManager.TYPE_通知);
myRingtone=RingtoneManager.getRingtone(getApplicationContext(),uri);
myToolbar=(Toolbar)findviewbyd(R.id.Toolbar);
mySpinner=(微调器)findviewbyd(R.id.Spinner);
flashlightButton=(ImageButton)findViewById(R.id.image);
myToolbar.setLogo(R.drawable.twoogyswatchmrrobot);
setTitle(getResources().getString(R.string.app_name));
ArrayAdapter myAdapter=新的ArrayAdapter(MainActivity.this,
R.layout.custom_微调器_itam,
getResources().getStringArray(R.array.Toolbar_下拉菜单_条目));
myAdapter.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
setAdapter(myAdapter);
ringtoneMP=MediaPlayer.create(这个,R.raw.games\u of the_王座);
ringtone=(按钮)this.findViewById(R.id.ringtone);
message=(EditText)findViewById(R.id.messagePublish);
mySpinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView AdapterView、View视图、int i、long l){
Toast.makeText(MainActivity.this,
mySpinner.getSelectedItem().toString(),
吐司,长度(短)
.show();
if(mySpinner.getSelectedItem().toString().equals(“退出应用程序”)){
退出();
}else if(mySpinner.getSelectedItem().toString().equals(“设置”))
{
意图;
intent=新intent(MainActivity.this、setingsActivity.class);
intent.putExtra(“CURRENT_IP”,client.getServerURI());
intent.putExtra(“当前_QOS”,Integer.toString(QOS));
intent.putExtra(“当前主题”,topicStr);
startActivityForResult(intent,1);//这样我们以后就可以将结果带回mainActivity
}否则{
系统输出打印(“ara3e,den exw diale3ei tipota”);
}
}
@凌驾
未选择公共无效(AdapterView AdapterView){
}
});
//开始创建时使用手电筒
if(isFlashAvailable())//检查此设备上是否有闪光灯,是否打开摄像头(模块),并使按钮可单击
{
camera=camera.open();
parameters=camera.getParameters();
}否则
{//如果不支持手电筒,请不要让用户单击按钮
flashlightButton.setEnabled(错误);
AlertDialog.Builder=新建AlertDialog.Builder(MainActivity.this);
builder.setTitle(“错误”);
builder.setMessage(“手电筒在此设备上不可用。\nExit?”);//通知用户并让他选择如何继续
builder.setPositiveButton(“是”,新建DialogInterface.OnClickListener(){
@凌驾
公共void onClick(DialogInterface,inti){
dialogInterface.dismise();
退出();
}
});
setNegativeButton(“不用手电筒”,新建DialogInterface.OnClickListener()){
@凌驾
公共void onClick(DialogInterface,inti){
dialogInterface.dismise();
}
});
AlertDialog AlertDialog=builder.create();
alertDialog.show();
}
flashlightButton.setOnClickListener(新视图.OnClickListener(){//侦听flash按钮的单击
@凌驾
公共void onClick(视图){
flashOnOff();
}
});
ringtone.setOnClickListener(新视图.OnClickListener(){//ringtone listener
@凌驾
公共void onClick(视图){
ringtoneOnOff(ringtoneMP);
}
});
client=新的MqttAndroidClient(MainActivity.this、brokerrip、clientId);
//client=pahoMqttClient.getMqttClient(MainActivity.this、BrokerIp、clientId);
选项=新的MqttConnectOptions();
options.setUserName(用户名);
options.setPassword(Password.toCharArray());
试一试{
imqttoken令牌=client.connect(选项);
token.setActionCallback(新的IMqttActionListener(){
@凌驾
成功时公共无效(IMqttToken asyncActionToken){
//我们是有联系的
Toast.makeText(MainActivity.this,“connected”,Toast.LENGTH_SHORT.show();
setSubscription(客户端、topicStr、qos);
}
@凌驾
public void onFailure(IMqttToken asyncActionToken,可丢弃异常){
//出现问题,例如连接超时或火灾
public class MainActivity extends AppCompatActivity {

//    Layout related parameters
Toolbar myToolbar;
Spinner mySpinner;
ImageButton flashlightButton;
Button ringtone;
EditText message;

//  Camera/flashlight related parameters
Camera camera;
Camera.Parameters parameters;

//    MQTT related parameters
private String BrokerIp = "tcp://192.168.1.3:1883";
private int qos = 2;
static String Username = "user1";
static String Password = "user1";
String topicStr = "commands";
String clientId = "AndroidClient";
MqttConnectOptions options;
MqttAndroidClient client;
Vibrator vibrator;


//  Ringtone related parameters
Ringtone myRingtone;
MediaPlayer ringtoneMP ;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    vibrator = (Vibrator)getSystemService(VIBRATOR_SERVICE);

    Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    myRingtone = RingtoneManager.getRingtone(getApplicationContext(),uri);

    myToolbar = (Toolbar) findViewById(R.id.toolbar);
    mySpinner = (Spinner) findViewById(R.id.spinner);
    flashlightButton = (ImageButton) findViewById(R.id.image);

    myToolbar.setLogo(R.drawable.twoguyswatchmrrobot);
    myToolbar.setTitle(getResources().getString(R.string.app_name));

    ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(MainActivity.this,
            R.layout.custom_spinner_itam,
            getResources().getStringArray(R.array.Toolbar_dropdown_entries));
    myAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    mySpinner.setAdapter(myAdapter);

    ringtoneMP = MediaPlayer.create(this,R.raw.games_of_thrones);
    ringtone = (Button) this.findViewById(R.id.ringtone);

    message = (EditText)findViewById(R.id.messagePublish);

    mySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
            Toast.makeText(MainActivity.this,
                    mySpinner.getSelectedItem().toString(),
                    Toast.LENGTH_SHORT)
                    .show();

            if (mySpinner.getSelectedItem().toString().equals("Exit App")){
                exit();
            }else if(mySpinner.getSelectedItem().toString().equals("Settings"))
            {
                Intent intent;
                intent = new Intent(MainActivity.this, SettingsActivity.class);
                intent.putExtra("CURRENT_IP",client.getServerURI());
                intent.putExtra("CURRENT_QOS", Integer.toString(qos));
                intent.putExtra("CURRENT_TOPIC",topicStr);
                startActivityForResult(intent,1);   //  this is so we can take the results back to mainActivity later
            }else{
                System.out.println("ara3e, den exw diale3ei tipota");
            }

        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }

    });

    //Flashlight on Create start
    if(isFlashAvailable())   //  check if flash is available on this device, if it is open camera (module) and make button clickable
    {
        camera = Camera.open();
        parameters = camera.getParameters();

    }else
    {  //  if flashlight is not supported dont let the user click the button

        flashlightButton.setEnabled(false);
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("Error.");
        builder.setMessage("Flashlight not available on this device. \nExit?");   //  inform the user and let him choose how to continue
        builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                dialogInterface.dismiss();
                exit();
            }
        });
        builder.setNegativeButton("Stay without flashlight", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                dialogInterface.dismiss();

            }
        });
        AlertDialog alertDialog = builder.create();
        alertDialog.show();
    }

    flashlightButton.setOnClickListener(new View.OnClickListener() { //  listen for flash button clicks
        @Override
        public void onClick(View view) {
            flashOnOff();
        }
    });

    ringtone.setOnClickListener(new View.OnClickListener() {    //  Ringtone listener
        @Override
        public void onClick(View view) {
            ringtoneOnOff(ringtoneMP);
        }
    });


    client = new MqttAndroidClient(MainActivity.this, BrokerIp, clientId);
//        client = pahoMqttClient.getMqttClient(MainActivity.this,BrokerIp,clientId);


    options = new MqttConnectOptions();
    options.setUserName(Username);
    options.setPassword(Password.toCharArray());

    try {
        IMqttToken token = client.connect(options);
        token.setActionCallback(new IMqttActionListener() {
            @Override
            public void onSuccess(IMqttToken asyncActionToken) {
                // We are connected
                Toast.makeText(MainActivity.this, "connected", Toast.LENGTH_SHORT).show();
                setSubscription(client,topicStr,qos);
            }
            @Override
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                // Something went wrong e.g. connection timeout or firewall problems
                Log.w("Mqtt","Failed to connect to:"+ BrokerIp + exception.toString());
                Toast.makeText(MainActivity.this, "Failed to connect to:" +exception.toString(), Toast.LENGTH_SHORT).show();
            }
        });
    } catch (MqttException e) {
        e.printStackTrace();
    }

    client.setCallback(new MqttCallback() {
        @Override
        public void connectionLost(Throwable throwable) {
            Log.d("Connection:"," Lost");
        }

        @Override
        public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
            myMessageArrived(s,mqttMessage);
        }
        @Override
        public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
            Log.d("Delivery"," completed with iMqttDeliveryToken: " + iMqttDeliveryToken);
        }
    });

}

//Flashlight start
@Override
protected void onStop() {
    super.onStop();
    if(camera!=null)
    {
        camera.release();
        camera = null;
    }
}
//Flashlight end

//Backkey exit confirmation
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        exitByBackKey();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

protected void exitByBackKey() {

    AlertDialog alertbox = new AlertDialog.Builder(this)
            .setMessage("Do you want to exit application?")
            .setPositiveButton("Yes", new
                    DialogInterface.OnClickListener() {

                        // when yes is clicked exit the application
                        public void onClick(DialogInterface arg0, int arg1) {
                            exit();
                        }
                    })
            .setNegativeButton("No", new
                    DialogInterface.OnClickListener() {

                        // when no is clicked do nothing
                        public void onClick(DialogInterface arg0, int arg1) {
                        }
                    })
            .show();

}
//Backkey end

// PUBLISH MESSAGE
private void setSubscription(MqttAndroidClient client, String topic, int qos){
    try{
        client.subscribe(topic, qos);
    }
    catch (MqttException e){
        e.printStackTrace();
    }
}

private void unsetSubscription(MqttAndroidClient client,String topic){
    try{
        client.unsubscribe(topic);
    }catch (MqttException e){
        e.printStackTrace();
    }
}

public void conn(View v){
    try {
        IMqttToken token = client.connect(options);
        token.setActionCallback(new IMqttActionListener() {
            @Override
            public void onSuccess(IMqttToken asyncActionToken) {
                // We are connected
                Toast.makeText(MainActivity.this, "connected", Toast.LENGTH_SHORT).show();
                setSubscription(client,topicStr,qos);
//                    pub();
            }
            @Override
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                // Something went wrong e.g. connection timeout or firewall problems
                Toast.makeText(MainActivity.this, "not connected", Toast.LENGTH_SHORT).show();
            }
        });
    } catch (MqttException e) {
        e.printStackTrace();
    }
}

public void disconn(View v){
    if (client.isConnected()) {
        try {
            IMqttToken token = client.disconnect();
            token.setActionCallback(new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken asyncActionToken) {
                    // We are connected
                    Toast.makeText(MainActivity.this, "disconnected", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                    // Something went wrong e.g. connection timeout or firewall problems
                    Toast.makeText(MainActivity.this, "could not disconnect", Toast.LENGTH_SHORT).show();
                }
            });
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }else {
        Toast.makeText(MainActivity.this, "Client is already disconnected", Toast.LENGTH_LONG).show();
    }
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

public void pub(View v) {
    String topic = topicStr;
    try {

        client.publish(topic, String.valueOf(message.getText()).getBytes(),qos,false);
    } catch (MqttException e) {
        e.printStackTrace();
    }
}

private void ringtoneOnOff(MediaPlayer ringtoneMP){
    if (ringtoneMP.isPlaying()){
        ringtoneMP.pause();
    }else{
        ringtoneMP.start();
    }
}

private void myMessageArrived(String s,MqttMessage mqttMessage){
    if ((mqttMessage.toString()).equals("Flash on")) {
        if (isFlashOn()) {
            Toast.makeText(MainActivity.this, "Flashlight already on", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(MainActivity.this, "Turning flashlight on", Toast.LENGTH_SHORT).show();
            flashOnOff();
        }
    } else if ((mqttMessage.toString()).equals("Flash off")) {
        if (isFlashOn()) {
            Toast.makeText(MainActivity.this, "Turning flashlight off", Toast.LENGTH_SHORT).show();
            flashOnOff();
        } else {
            Toast.makeText(MainActivity.this, "Flashlight already off", Toast.LENGTH_SHORT).show();
        }
    } else if ((mqttMessage.toString()).equals("Ringtone on")) {
        if (ringtoneMP.isPlaying()) {
            Toast.makeText(MainActivity.this, "Ringtone already playing", Toast.LENGTH_SHORT).show();

        } else {
            Toast.makeText(MainActivity.this, "Playing ringtone", Toast.LENGTH_SHORT).show();
            ringtoneMP.start();
        }
    } else if ((mqttMessage.toString()).equals("Ringtone off")) {
        if (ringtoneMP.isPlaying()) {
            ringtoneMP.pause();
        } else {
            Toast.makeText(MainActivity.this, "Ringtone already not being played", Toast.LENGTH_SHORT).show();
        }
    } else {
        Log.d("INFO:", "This Command does not exist");
    }
    vibrator.vibrate(500);
    myRingtone.play();
}

public void exit(){
    finish();
    System.exit(0);
}

public boolean isFlashAvailable(){  //  boolean function that returns true if flash is supported on this device

    return getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
}

public void flashOnOff(){   //  self explanatory

    if (this.parameters.getFlashMode().equals(android.hardware.Camera.Parameters.FLASH_MODE_ON) || this.parameters.getFlashMode().equals(android.hardware.Camera.Parameters.FLASH_MODE_TORCH)){  //  if the flash is on torch mode
        Log.d("BHKE","408");
        this.flashlightButton.setImageResource(R.drawable.off);
        this.parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);  //  turn it off
    }else{
        Log.d("BHKE","412");
        this.flashlightButton.setImageResource(R.drawable.on);
        this.parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);    //  else turn it on
    }
    this.camera.setParameters(this.parameters);
    this.camera.startPreview();
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    String tempBrokerIp;
    String temptopic="";
    Integer tempqos;
    Boolean BrokerIpChanged = true;
    Boolean qosChanged = true;
    Boolean topicChanged = true;
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode) {
        case (1) : {
            if (resultCode == Activity.RESULT_OK) {
                tempBrokerIp = data.getStringExtra("CURRENT_IP");
                tempqos = Integer.parseInt(data.getStringExtra("CURRENT_QOS"));
                temptopic = data.getStringExtra("CURRENT_TOPIC");

                Log.d("Info BROKER, TOPIC, QOS", ":"+ tempBrokerIp+ " " + temptopic+ " " + tempqos);
                if (tempBrokerIp.equals(BrokerIp)) {
                    BrokerIpChanged=false;
                    Log.i("BrokerIpChanged =", BrokerIpChanged.toString());
                }
                if (tempqos.equals(qos)) {
                    qosChanged=false;
                    Log.i("qosChanged =", qosChanged.toString());
                }else {
                    qos = tempqos;
                }
                if (temptopic.equals(topicStr)){
                    topicChanged=false;
                    Log.i("topicChanged =", topicChanged.toString());
                }else{
                    topicStr = temptopic;
                }
                if (!BrokerIpChanged && !qosChanged && !topicChanged) return;

                if (BrokerIpChanged){
                    try {
                        client.disconnect();

                        BrokerIp = tempBrokerIp;
                        topicStr = temptopic;
                        qos = tempqos;
//                            final String clientId = MqttClient.generateClientId();
                        client = new MqttAndroidClient(MainActivity.this, BrokerIp, clientId);


                        options = new MqttConnectOptions();
                        options.setUserName(Username);
                        options.setPassword(Password.toCharArray());
//                            options.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1);  //  to user the latest mqtt version

                        try {
                            IMqttToken token = client.connect(options);
                            token.setActionCallback(new IMqttActionListener() {
                                @Override
                                public void onSuccess(IMqttToken asyncActionToken) {
                                    // We are connected
                                    Toast.makeText(MainActivity.this, "connected", Toast.LENGTH_SHORT).show();
                                    Log.w("Mqtt","Connected to:"+ BrokerIp);

                                    try{
                                        Log.v("INFO 11111:", "about to subscribe with: "+ topicStr + qos);
                                        client.subscribe(topicStr,qos);
                                    }catch (MqttException e){
                                        e.printStackTrace();
                                    }
                                }
                                @Override
                                public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                                    // Something went wrong e.g. connection timeout or firewall problems
                                    Log.w("Mqtt","Failed to connect to:"+ BrokerIp + exception.toString());
                                    Toast.makeText(MainActivity.this, "Failed to connect to:" +exception.toString(), Toast.LENGTH_SHORT).show();
                                }

                            });
                            System.out.println(client.isConnected());
//                                if (client.isConnected()){
//                                    Log.v("INFO 22222:", "about to subscribe with: "+ temptopic + tempqos);
//                                    client.subscribe(temptopic,tempqos);
//                                }

                        } catch (MqttException e) {
                            e.printStackTrace();
                        }

                        client.setCallback(new MqttCallback() {
                            @Override
                            public void connectionLost(Throwable throwable) {

                            }

                            @Override
                            public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
                                myMessageArrived(s,mqttMessage);
                            }

                            @Override
                            public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

                            }
                        });

                    }catch (MqttException e){
                        e.printStackTrace();
                    }
                }else
                {
                    try {
                        client.unsubscribe(topicStr);
                        client.subscribe(temptopic,tempqos);

                        topicStr = temptopic;
                        qos = tempqos;

                    } catch (MqttException e) {
                        e.printStackTrace();
                    }
                }
            }
            break;
        }
    }
}

public boolean isFlashOn(){
    return (this.parameters.getFlashMode().equals(android.hardware.Camera.Parameters.FLASH_MODE_ON) || this.parameters.getFlashMode().equals(android.hardware.Camera.Parameters.FLASH_MODE_TORCH));
}
     if (isFlashAvailable()){
        camera = Camera.open();
        parameters = camera.getParameters();
    }