首页 > 解决方案 > 收到意图后警报应用程序崩溃(在 OnReceive() 中)

问题描述

所以我正在尝试制作一个应用程序..(或者更具体地说..练习把东西放在一起看看它们是如何工作的)如果我点击一个按钮就会设置一个警报......并且在设定的时间......它会改变我手机的壁纸。该应用程序运行完美,直到设定的时间到来..n 当应用程序应该更改我的墙纸时..应用程序崩溃..n 引发空指针异常。

我的 MainActivity 类代码:

package com.example.wp;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.WallpaperManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

import java.io.IOException;
import java.util.Calendar;

public class MainActivity extends AppCompatActivity {
    public Button b;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        b = findViewById(R.id.button);
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Calendar c = Calendar.getInstance();
                c.set(Calendar.HOUR_OF_DAY,14); //i want to change wallpaper at 2:00 . 
                c.set(Calendar.MINUTE,0);
                c.set(Calendar.SECOND,0);
                SetAlarm(c);

            }
        });
    }
    public void changewp(){
        Bitmap bit = BitmapFactory.decodeResource(getResources(),R.drawable.wp);
        WallpaperManager wm = WallpaperManager.getInstance(getApplicationContext());

        try {
            wm.setBitmap(bit);
            Toast.makeText(getApplicationContext(),"done",3).show();
        } catch (IOException e) {
            Toast.makeText(getApplicationContext(),"failed",3).show();
        }
    }
    public void SetAlarm(Calendar c){
        AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, alertrec.class);
        PendingIntent pen = PendingIntent.getBroadcast(this, 1,intent,0);
        am.setExact(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(),pen);
    }

}

我的alartrec类代码:

package com.example.wp;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class alertrec extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        MainActivity m = new MainActivity();
        m.changewp(); 

    }
}

我还尝试在 onReceive() 方法中的 changewp() 方法中编写代码...bt 无法正确使用参数。因此,如果您有更好(但不太复杂)的方法来完成我正在尝试的事情..请让我知道。还有一件事……我不是 JAVA 专家……所以我犯的错误可能很愚蠢……但我花了很多时间寻找解决方案……但一无所获。

任何形式的帮助将不胜感激。

标签: android

解决方案


或者您可以像这样移动changewp()方法BroadcastReceiver

public class alertrec extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        changewp(context);
    }

    public void changewp(Context context){
        Bitmap bit = BitmapFactory.decodeResource( context.getResources(),R.drawable.ic_launcher_background);
        WallpaperManager wm = WallpaperManager.getInstance(context);

        try {
            wm.setBitmap(bit);
            Toast.makeText(context,"done",Toast.LENGTH_LONG).show();
        } catch (IOException e) {
            Toast.makeText(context,"failed",Toast.LENGTH_LONG).show();
        }
    }
}

推荐阅读