2017-06-13 104 views
-2

我想實現一個廣播接收器來獲取事件時,我卸載,安裝和打電話(傳入和傳出)。我在AndroidManifest.xml中註冊了意圖過濾器,但是當我在手機上運行我的應用程序時,它會拋出運行時異常。Android:廣播接收器拋出java.lang.RuntimeException

我的代碼:

package com.local.broadcast_receiver; 

import android.content.BroadcastReceiver; 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.net.Uri; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.telephony.TelephonyManager; 
import android.util.Log; 

public class MainActivity extends android.content.BroadcastReceiver { 

static boolean flag = false; 
static long start_time_incoming = 0; 
static long start_time_outgoing = 0; 
static long end_time; 

@Override 
public void onReceive(Context ctx, Intent intent){ 

    String action = intent.getAction(); 

    if (action.equalsIgnoreCase("android.intent.action.PHONE_STATE")) { 

     if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
       TelephonyManager.EXTRA_INCOMING_NUMBER)) { 
      start_time_incoming = System.currentTimeMillis(); 

     }else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
       TelephonyManager.EXTRA_STATE_RINGING)) { 
      start_time_outgoing = System.currentTimeMillis(); 
     } 

     if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
       TelephonyManager.EXTRA_STATE_IDLE)) { 
      end_time = System.currentTimeMillis(); 
     } 

     if (start_time_incoming != 0) { 
      //Total time talked = 
      long total_time = end_time - start_time_incoming; 
      //Store total_time somewhere or pass it to an Activity using intent 
      Log.i("Broadcast", "Last incoming call duration:" + total_time); 

     }else if (start_time_outgoing != 0) { 
      //Total time talked = 
      long total_time = end_time - start_time_outgoing; 
      //Store total_time somewhere or pass it to an Activity using intent 
      Log.i("Broadcast", "Last outgoing call duration:" + total_time); 
     } 

    }else if(intent.getAction().equals("android.intent.action.PACKAGE_REMOVED")) { 

     Uri uri = intent.getData(); 
     String pkg = uri != null ? uri.getSchemeSpecificPart() : null; 
     Log.i("Broadcast", "name of package removed is:" + pkg); 
    }else if(intent.getAction().equals("android.intent.action.PACKAGE_ADDED")) { 

     Uri uri = intent.getData(); 
     String pkg = uri != null ? uri.getSchemeSpecificPart() : null; 
     Log.i("Broadcast","name of package Added is:" + pkg); 
    } 
} 
} 

和我的AndroidManifest.xml看起來象下面這樣: -

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

<uses-permission 
    android:name="android.permission.READ_CALL_LOG" 
    android:maxSdkVersion="25" /> 
<uses-permission 
    android:name="android.permission.READ_EXTERNAL_STORAGE" 
    android:maxSdkVersion="25" /> 

<receiver android:name="MainActivity"> 
    <intent-filter> 
     <action android:name="android.intent.action.PHONE_STATE" /> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.intent.action.PACKAGE_REMOVED" /> 
     <action android:name="android.intent.action.PACKAGE_ADDED" /> 

     <data android:scheme="package" /> 
    </intent-filter> 
</receiver> 

<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> 
</application> 
</manifest> 

,我得到的RuntimeException: -

                   java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.local.broadcast_receiver/com.local.broadcast_receiver.MainActivity}: java.lang.ClassCastException: com.local.broadcast_receiver.MainActivity cannot be cast to android.app.Activity 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2819) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988) 
                      at android.app.ActivityThread.-wrap14(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:154) 
                      at android.app.ActivityThread.main(ActivityThread.java:6682) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 
                     Caused by: java.lang.ClassCastException: com.local.broadcast_receiver.MainActivity cannot be cast to android.app.Activity 
                      at android.app.Instrumentation.newActivity(Instrumentation.java:1086) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2809) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988)  
                      at android.app.ActivityThread.-wrap14(ActivityThread.java)  
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631)  
                      at android.os.Handler.dispatchMessage(Handler.java:102)  
                      at android.os.Looper.loop(Looper.java:154)  
                      at android.app.ActivityThread.main(ActivityThread.java:6682)  
                      at java.lang.reflect.Method.invoke(Native Method)  
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)  
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)  

試圖通過提供不同的職位搜索這裏主題「不能轉換爲android.app.Activity」但無法獲得任何提示。有人可以指出什麼是錯的,我應該怎麼做才能在手機上運行此代碼?

謝謝

+1

'com.local.broadcast_receiver.MainActivity不能轉換爲android.app.Activity' – Shark

回答

1

請用你的代碼/實現來分析錯誤日誌。 java.lang.ClassCastException:致

com.local.broadcast_receiver.MainActivity不能轉換到 android.app.Activity

您已經聲明<activity android:name=".MainActivity">這實際上是一個BroadcastReceiver。所以申報爲<receiver />

更新您的清單正確,請參閱Android Manifest Documentation