使用BatteryManager接收广播意图时出错

时间:2015-06-30 21:35:00

标签: java android

我在接收广播意图时遇到错误我正在使用BatteryManager。我不知道为什么我收到这个错误。

有人请帮忙。 提前谢谢

如果您需要更多代码,请与我们联系。

这是错误:

> Error receiving broadcast Intent {
> act=android.intent.action.BATTERY_CHANGED flg=0x60000010 (has extras)
> } in com.example.android.login.MainActivity$1@260e12dc
>             at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:933)
>             at android.os.Handler.handleCallback(Handler.java:739)
>             at android.os.Handler.dispatchMessage(Handler.java:95)
>             at android.os.Looper.loop(Looper.java:145)
>             at android.app.ActivityThread.main(ActivityThread.java:5972)
>             at java.lang.reflect.Method.invoke(Native Method)
>             at java.lang.reflect.Method.invoke(Method.java:372)
>             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
>             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
>      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void
> android.widget.TextView.setText(java.lang.CharSequence)' on a null
> object reference
>             at com.example.android.login.MainActivity$1.onReceive(MainActivity.java:37)
>             at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:923)
>             at android.os.Handler.handleCallback(Handler.java:739)
>             at android.os.Handler.dispatchMessage(Handler.java:95)
>             at android.os.Looper.loop(Looper.java:145)
>             at android.app.ActivityThread.main(ActivityThread.java:5972)
>             at java.lang.reflect.Method.invoke(Native Method)
>             at java.lang.reflect.Method.invoke(Method.java:372)

活动类

package com.example.android.login;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.os.BatteryManager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.parse.LogOutCallback;
import com.parse.Parse;
import com.parse.ParseObject;
import com.parse.ParseUser;

import com.parse.ParseException;


public class MainActivity extends ActionBarActivity {
    private TextView batteryTxt;
    private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver(){
        @Override
        public void onReceive(Context ctxt, Intent intent) {
            int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
            batteryTxt.setText(String.valueOf(level) + "%");
        }
    };
    private Toolbar toolbar;
    public Button logoutButton;
    public int level;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        batteryTxt = (TextView) this.findViewById(R.id.percent);
        this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_appbar);
        toolbar = (Toolbar) findViewById(R.id.app_bar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        NavigationDrawerFragment drawerFragment = (NavigationDrawerFragment)
                getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
        drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawerLayout), toolbar);

        logoutButton = (Button) findViewById(R.id.logoutButton);
        logoutButton.setOnClickListener(new View.OnClickListener() {
            @Override
             public void onClick(View v) {
                // Set up a progress dialog
                final ProgressDialog logout = new ProgressDialog(MainActivity.this);
                logout.setTitle("Please wait.");
                logout.setMessage("Logging out.  Please wait.");
                logout.show();
                ParseUser.logOutInBackground(new LogOutCallback() {

                    public void done(ParseException e) {
                        logout.dismiss();
                        if (e == null) {
                            Intent logoutDone = new Intent(MainActivity.this, DispatchActivity.class);
                            startActivity(logoutDone);
                        } else {
                            Toast.makeText(MainActivity.this, "Logout Unsuccessful", Toast.LENGTH_LONG).show();
                        }
                    }
                });
            }
        });


    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

}

2 个答案:

答案 0 :(得分:1)

根据您的堆栈跟踪,看起来它正在抛出NullPointerException,因为batteryTxt字段在收到intent时为null。正如Daniel Nugent指出的那样,这是因为接收者在调用setContentView()之前已经注册。但是,看起来你也永远不会取消注册你的接收器,所以我建议移动代码将接收器注册到onResume()方法,并在onPause()方法中添加注销,以防止这种情况发生。当您的活动停止时发生NullPointerException。

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}

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

答案 1 :(得分:0)

这样做

batteryTxt =(TextView)this.findViewById(R.id.percent);

之后

<强>的setContentView(R.layout.activity_main_appbar);

始终在错误日志

中阅读此部分
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void
android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference 

编写类似的代码

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_appbar);
    toolbar = (Toolbar) findViewById(R.id.app_bar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    batteryTxt = (TextView) this.findViewById(R.id.percent);
    this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));