java - Android BroadcastReceiver 注册时出现空指针异常

标签 java android broadcastreceiver android-launcher android-download-manager

我正在尝试接收下载完成的操作,但它说广播接收器在注册时为空。
但我查了一下,显然不是。

The LogCat Error

public class UpdateHandler extends Activity{

    private DownloadManager manager;

    /**
     * Class Constructor will only be used for non-static Referencing in a static condition.
     */
    public UpdateHandler(DownloadManager dm){
        this.manager = dm;  
    }


    public void updateApp(final String appname) {

        String apkurl = apk_url + appname;
        DownloadManager.Request request = new DownloadManager.Request(
                Uri.parse(apkurl));
        request.setDescription("Even geduld aub...");
        request.setTitle("Bimii-app wordt gedownload");
        request.setDestinationInExternalPublicDir(
                Environment.DIRECTORY_DOWNLOADS, appname);

        File folder1 = android.os.Environment
                .getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOWNLOADS
                        + "/" + appname);
        if (folder1.exists()) {
            Log.d("!--->", Environment.DIRECTORY_DOWNLOADS + "/" + appname
                    + " pre-existant, delete!");
            folder1.delete();
        } else {
            Log.d("!--->", Environment.DIRECTORY_DOWNLOADS + "/" + appname
                    + " is new.");
        }

        registerBroadcastReceiver(request, appname);
    }


    /**
     * Installing a specific Application by name.
     * @param appname
     */
    private void installUpdates(String appname) {
        Log.d("installing ", appname);
        File filepath = android.os.Environment
                .getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DOWNLOADS
                        + "/" + appname);

        Intent install_intent = new Intent(Intent.ACTION_VIEW);
        install_intent.setDataAndType(Uri.fromFile(filepath),
                "application/vnd.android.package-archive");
        install_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);     
        startActivity(install_intent);
    }


    private void registerBroadcastReceiver(DownloadManager.Request request, final String appname){
        // get download service and enqueue file
        manager.enqueue(request);

        BroadcastReceiver downloadDone = new BroadcastReceiver() {
            public void onReceive(Context ctxt, Intent intent) {
                Log.d("!--->", "File Download Completed + appname");
                installUpdates(appname);
            }
        };

        registerReceiver(downloadDone, new IntentFilter(
                DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    }
}

这就是我根据请求初始化 UpdateHandler 的方式。 这发生在我的家庭 Activity 中。

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //Initialization
    init();

    loadApps();
    update_handler = new UpdateHandler((DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE));
    setupButtons();
    loadListView();
}

我正在运行的 Android 版本是 4.2.2,以防万一。

最佳答案

您需要有一个 Activity/应用程序上下文来注册广播接收器。

正如我从屏幕截图中看到的,您正在从 utils.UpdateHandler 文件注册接收器,因此您需要将应用程序上下文传递给此方法。

所以代码将是

/**
     * Class Constructor will only be used for non-static Referencing in a static condition.
     */
    public UpdateHandler(Context context, DownloadManager dm){
        this.mContext = context;
        this.manager = dm;  
    }

然后调用context.registerReceiver()

关于java - Android BroadcastReceiver 注册时出现空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32248123/

相关文章:

java - Jtable 和 MySql

java - 出错时重复 CXF 请求

java - 无法在 Kotlin 中调用 FileProvider 的 getUriForFile

android - 更改屏幕方向后广播接收器崩溃并且不工作

android - 如何注入(inject)广播接收器

java - 如何在Jsp中使用条件 <p :fileUpload

java - 程序 map 生成

java - Android 适配器 AlertDialog 错误

android - 从 android 向服务器发送单个图像

android - BroadcastReceiver 如何开始新的 Intent