为什么我的应用程序在收到日期时崩溃改变了广播?

时间:2018-02-07 17:42:22

标签: android date android-intent service broadcastreceiver

每个人我是android的初学者并创建我的项目Android应用程序,接收广播并相应地更改壁纸。应用程序在激活它时更改壁纸,但当我通过更改日期生成事件时应用程序崩溃并停止有人会帮我解决我的代码并告诉我它有什么问题吗? 请帮忙 这是代码:

MyDateReceiver.class

package com.example.vinay.imager;

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

/**
 * Created by VINAY on 04-02-2018.
 */

public class MyDateReceiver extends BroadcastReceiver {
    WeekService weekService;
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(Intent.ACTION_DATE_CHANGED)||intent.getAction().equals(Intent.ACTION_TIME_CHANGED))
        {
            context.startService(intent);
            System.out.println("Receiver Activated");

        }
        else
        {

        }
    }
}

WeekService.class

package com.example.vinay.imager;

import android.app.Service;
import android.app.WallpaperManager;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.support.annotation.Nullable;

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



public class WeekService extends Service  {
    private MyDateReceiver br;
    public IntentFilter intentFilter;

    private void dateChanger()
    {
        Calendar cd=Calendar.getInstance();
        int day=cd.get(Calendar.DAY_OF_WEEK);
        String []days=new String[]{"SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY"};
        System.out.println("Today is"+days[day-1]);
        final String k=days[day-1];
        WallpaperManager wm=WallpaperManager.getInstance(getApplicationContext());
        try {
            if(k.equals("MONDAY")) {
                wm.setResource(R.drawable.ab);
            }
            else if(k.equals("TUESDAY")) {
                wm.setResource(R.drawable.dp);
            }
            else if(k.equals("WEDNESDAY")) {
                wm.setResource(R.drawable.mm);
            }
            else if(k.equals("THURSDAY")) {
                wm.setResource(R.drawable.nmn);
            }
            else if(k.equals("FRIDAY")) {
                wm.setResource(R.drawable.nn);
            }
            else if(k.equals("SATURDAY")) {
                wm.setResource(R.drawable.spr);
            }
            else
            {
                wm.setResource(R.drawable.spr2);
                System.out.println("Hi"+k);
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //Registering to broadcast
        br=new MyDateReceiver();
        intentFilter=new IntentFilter();
        intentFilter.addAction(Intent.ACTION_DATE_CHANGED);
        intentFilter.addAction(Intent.ACTION_TIME_CHANGED);
        intentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
        intentFilter.addAction(Intent.ACTION_TIME_TICK);
        this.registerReceiver(br,intentFilter);
        //


        dateChanger();
        return START_STICKY;

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        stopSelf();
        System.out.println("Service Stopped..");
        this.unregisterReceiver(br);
        System.out.println("Receiver unregistered..");
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        dateChanger();
        return null;
    }
}

Mainactivity.class

package com.example.vinay.imager;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity  {
    private Intent servIntent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Button act = (Button) findViewById(R.id.activate);
        final Button deact = (Button) findViewById(R.id.deactivate);

        ImageView wlp = (ImageView) findViewById(R.id.imView);
        wlp.setImageResource(R.drawable.spr);

        servIntent = new Intent(getApplicationContext(), WeekService.class);
        act.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(act.getText().equals("Activate"))
                {
                    startService(servIntent);
                    Toast.makeText(MainActivity.this,"Imager Activated",Toast.LENGTH_LONG).show();
                }
            }
        });
        deact.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(deact.getText().equals("Deactivate"))
                {
                    System.out.println("Service Terminated..");
                    stopService(servIntent);
                    Toast.makeText(MainActivity.this,"Service Terminated..",Toast.LENGTH_LONG).show();
                }
            }
        });
    }
    }

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.vinay.imager">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>
        <service android:name=".WeekService"/>
    </application>

    <uses-permission android:name="android.permission.SET_WALLPAPER"/>
</manifest>

activiyt_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.vinay.imager.MainActivity">

    <Button
        android:id="@+id/activate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="208dp"
        android:text="Activate"
        app:layout_constraintBottom_toBottomOf="parent"
        android:onClick="onClick" />

    <Button
        android:id="@+id/deactivate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Deactivate"
        app:layout_editor_absoluteY="320sp"
        tools:layout_editor_absoluteX="26dp"
        tools:layout_editor_absoluteY="316dp"
        app:layout_constraintTop_toBottomOf="@id/activate"/>

    <ImageView
        android:id="@+id/imView"
        android:layout_width="161dp"
        android:layout_height="157dp"
        app:layout_constraintBottom_toTopOf="@id/activate"
        android:layout_marginLeft="42sp"
        android:layout_marginRight="42sp"
        android:adjustViewBounds="false"
        app:srcCompat="@android:drawable/gallery_thumb"
        tools:layout_editor_absoluteX="112dp"
        tools:layout_editor_absoluteY="44dp"
        />

</android.support.constraint.ConstraintLayout>

Logcatfile

02-10 01:50:10.558 2827-2827/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                 Process: com.example.vinay.imager, PID: 2827
                                                 java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.TIME_SET flg=0x24000010 } in com.example.vinay.imager.MyDateReceiver@5dbe656
                                                     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:1132)
                                                     at android.os.Handler.handleCallback(Handler.java:751)
                                                     at android.os.Handler.dispatchMessage(Handler.java:95)
                                                     at android.os.Looper.loop(Looper.java:154)
                                                     at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
                                                  Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=android.intent.action.TIME_SET flg=0x24000010 }
                                                     at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1345)
                                                     at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1374)
                                                     at android.app.ContextImpl.startService(ContextImpl.java:1358)
                                                     at android.content.ContextWrapper.startService(ContextWrapper.java:613)
                                                     at com.example.vinay.imager.MyDateReceiver.onReceive(MyDateReceiver.java:20)
                                                     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:1122)
                                                     at android.os.Handler.handleCallback(Handler.java:751) 
                                                     at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                     at android.os.Looper.loop(Looper.java:154) 
                                                     at android.app.ActivityThread.main(ActivityThread.java:6119) 
                                                     at java.lang.reflect.Method.invoke(Native Method) 
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
02-10 01:50:11.485 1315-2390/? E/SurfaceFlinger: ro.sf.lcd_density must be defined as a build property
02-10 01:50:14.086 4436-4637/com.google.android.music:main E/GmsUtils: Failed to connect to Google API client: ConnectionResult{statusCode=API_UNAVAILABLE, resolution=null, message=null}
02-10 01:50:15.371 2153-4134/com.android.settings E/BluetoothAdapter: Bluetooth binder is null
02-10 01:50:15.833 2472-3299/com.google.android.gms.persistent E/NetworkScheduler: ignoring stale queue check message
02-10 01:50:15.892 1762-3275/system_process E/BluetoothAdapter: Bluetooth binder is null
02-10 01:50:15.892 1762-3275/system_process E/BatteryStatsService: no controller energy info supplied
02-10 01:50:15.894 1762-3275/system_process E/KernelCpuSpeedReader: Failed to read cpu-freq: /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state (No such file or directory)
02-10 01:50:15.894 1762-3275/system_process E/KernelUidCpuTimeReader: Failed to read uid_cputime: /proc/uid_cputime/show_uid_stat (No such file or directory)
02-10 01:50:15.895 1762-3275/system_process E/BatteryStatsService: modem info is invalid: ModemActivityInfo{ mTimestamp=0 mSleepTimeMs=0 mIdleTimeMs=0 mTxTimeMs[]=[0, 0, 0, 0, 0] mRxTimeMs=0 mEnergyUsed=0}
02-10 01:50:45.654 2472-3299/com.google.android.gms.persistent E/NetworkScheduler: ignoring stale queue check message
02-10 02:00:01.544 2882-4875/com.google.android.gms E/MS_RegisterService: Exception during register request.
                                                                          bdpz: PERMISSION_DENIED: The caller does not have permission
                                                                              at bdpv.c(:com.google.android.gms@11947470:3)
                                                                              at mpe.a(:com.google.android.gms@11947470:89)
                                                                              at com.google.android.libraries.matchstick.net.SilentRegisterIntentOperation.a(:com.google.android.gms@11947470:253)
                                                                              at com.google.android.libraries.matchstick.net.SilentRegisterIntentOperation.onHandleIntent(:com.google.android.gms@11947470:342)
                                                                              at com.google.android.chimera.IntentOperation.onHandleIntent(:com.google.android.gms@11947470:2)
                                                                              at crr.run(:com.google.android.gms@11947470:10)
                                                                              at cro.run(:com.google.android.gms@11947470:9)
                                                                              at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                                              at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                                              at java.lang.Thread.run(Thread.java:761)

1 个答案:

答案 0 :(得分:0)

问题在于您对正在接收的意图说了startService。这是广播的系统意图,而非开始实际服务的意图。您需要创建正确的意图来启动您的服务。

Intent intent = new Intent(this, HelloService.class);
startService(intent);

上面将启动HelloService。您需要将其更改为您自己的服务。

如果您遇到崩溃,请在将来添加一个堆栈跟踪。