2012-08-05 35 views
0

我的工作我的最后一个项目,请帮帮我,我必须服从它,直到下周结束 IM上的应用程序的工作是过滤来电基于上下文的,起初我想要接收传入的号码并传递给一个活动在dataBase上搜索数字并返回结果,我不知道如何从broadcastReceiver获取变量并再次传递给它,我的意思是获取并传递变量为1个broadcastReceiver,因此我决定使用2 BroadCastReceiver,对他们采取传入号码,并传递到我的mainclass和我的mainCalss搜索数据库上的来电号码,并将结果传递给filterCall广播级,但我面临的问题。请帮助我,tHX如何通过一个变量的BroadcastReceiver

这是我的callActivity广播类,采取传入数量BER和传递给我的Mainclass

public class CallblockingActivity extends BroadcastReceiver { 


      Context context = null; 
      private static final String TAG = "Phone call"; 
      private ITelephony telephonyService; 
      String incommingNumber; 
      Intent intent; 
      String n; 

     @Override 

      public void onReceive(Context context, Intent intent) { 
        Log.v(TAG, "Receving...."); 
        TelephonyManager telephony = (TelephonyManager) 
        context.getSystemService(Context.TELEPHONY_SERVICE); 
        try { 
         Class c = Class.forName(telephony.getClass().getName()); 
         Method m = c.getDeclaredMethod("getITelephony"); 
         m.setAccessible(true); 
         telephonyService = (ITelephony) m.invoke(telephony);   
         Bundle b = intent.getExtras(); 
         incommingNumber = b.getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 
         Log.v(TAG, incommingNumber); 
         Intent i = new Intent(context, Mainclass.class); 
         i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         i.putExtra("n",incommingNumber); 
         context.startActivity(i); 
         Log.v(TAG, incommingNumber); 

        } 
        catch (Exception e) { 
         e.printStackTrace(); 
        } 

      } 

    } 

这是我mainClass是采取从CallBlockingActivity广播级的来电号码和查询数据库,并返回一个布尔值

public class Mainclass extends Activity{ 
Context context = null; 
Boolean isit= false; 
String TAG; 

    public void onCreate(Bundle savedInstanceState) { 
     Log.v(TAG,"onCreate"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 


     Intent b= getIntent(); 
     String incomiingnumber1= b.getStringExtra("n"); 
     Log.v(TAG,incomiingnumber1 + "incomenuber from broadcast receiver"); 
     DataBaseBON searching= new DataBaseBON(Mainclass.this); 
     searching.open(); 
     isit= searching.searchnumber(incomiingnumber1); 
     String ss= new Boolean(isit).toString();  
     Toast.makeText(getApplicationContext(), ss, Toast.LENGTH_SHORT); 
     Log.v(TAG, ss+ "yeeeeeeees it is it"); 
     searching.close(); 

     // I think My problem is here 
     Intent in = new Intent(context, FilterCall.class); 
     Bundle bb = new Bundle(); 
     bb.putString("keyvalue", "ss"); 
     in.putExtras(bb); 
     startActivity(in); 

    } 

} 

这是我的筛选BroadcastClass是拒绝通话或将手机设置为静音模式。

public class FilterCall extends BroadcastReceiver { 

private ITelephony telephonyService; 
String TAG; 
@Override 
public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 


    Log.v(TAG, "Filtering..."); 
    TelephonyManager telephony = (TelephonyManager) 
    context.getSystemService(Context.TELEPHONY_SERVICE); 
     try { 
     Class c = Class.forName(telephony.getClass().getName()); 
     Method m = c.getDeclaredMethod("getITelephony"); 
      m.setAccessible(true); 
      telephonyService = (ITelephony) m.invoke(telephony);   

      String result = intent.getStringExtra("keyvalue"); 


       if (result=="true") { 
       try { 
        telephonyService.silenceRinger(); 
        telephonyService.endCall(); 
       } catch (RemoteException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 


      } 


     } 
     catch (Exception e) { 
     e.printStackTrace(); 
     } 

} 

} 

我面对这个问题:

08-05 16:58:50.468: W/IInputConnectionWrapper(1500): showStatusIcon on inactive InputConnection 
    08-05 16:58:50.958: V/(1500): Filtering... 
    08-05 16:58:51.118: V/Phone call(1500): Receving.... 
08-05 16:58:51.118: V/Phone call(1500): +60172214866 
08-05 16:58:51.138: V/Phone call(1500): +60172214866 
    08-05 16:58:51.168: V/(1500): onCreate 
08-05 16:58:51.248: V/(1500): +60172214866incomenuber from broadcast receiver 
08-05 16:58:51.278: I/Database(1500): SQLiteDatabase open path: /data/data/com.vahid.davoudi/databases/databasebon.db 
08-05 16:58:51.338: V/(1500): trueyeeeeeeees it is it 
    08-05 16:58:51.338: I/Database(1500): SQLiteDatabase close path: /data/data/com.vahid.davoudi/databases/databasebon.db 
08-05 16:58:51.348: A/dalvikvm(1500): Exception!!! threadid=1: thread exiting with   uncaught exception (group=0x4001d858) 
08-05 16:58:51.388: E/AndroidRuntime(1500): FATAL EXCEPTION: main 
08-05 16:58:51.388: E/AndroidRuntime(1500): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.vahid.davoudi/com.vahid.davoudi.Mainclass}: java.lang.NullPointerException 
    08-05 16:58:51.388: E/AndroidRuntime(1500): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
08-05 16:58:51.388: E/AndroidRuntime(1500): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
    08-05 16:58:51.388: E/AndroidRuntime(1500): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
08-05 16:58:51.388: E/AndroidRuntime(1500): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
    08-05 16:58:51.388: E/AndroidRuntime(1500): at android.os.Handler.dispatchMessage(Handler.java:99) 
    08-05 16:58:51.388: E/AndroidRuntime(1500): at android.os.Looper.loop(Looper.java:123) 
    08-05 16:58:51.388: E/AndroidRuntime(1500): at android.app.ActivityThread.main(ActivityThread.java:4627) 
    08-05 16:58:51.388: E/AndroidRuntime(1500): at java.lang.reflect.Method.invokeNative(Native Method) 
    08-05 16:58:51.388: E/AndroidRuntime(1500): at java.lang.reflect.Method.invoke(Method.java:521) 
    08-05 16:58:51.388: E/AndroidRuntime(1500): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
    08-05 16:58:51.388: E/AndroidRuntime(1500): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    08-05 16:58:51.388: E/AndroidRuntime(1500): at dalvik.system.NativeStart.main(Native Method) 
    08-05 16:58:51.388: E/AndroidRuntime(1500): Caused by: java.lang.NullPointerException 
    08-05 16:58:51.388: E/AndroidRuntime(1500): at android.content.ComponentName.<init>(ComponentName.java:75) 
     08-05 16:58:51.388: E/AndroidRuntime(1500): at android.content.Intent.<init>(Intent.java:2690) 
    08-05 16:58:51.388: E/AndroidRuntime(1500): at com.vahid.davoudi.Mainclass.onCreate(Mainclass.java:39) 
08-05 16:58:51.388: E/AndroidRuntime(1500): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    08-05 16:58:51.388: E/AndroidRuntime(1500): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
    08-05 16:58:51.388: E/AndroidRuntime(1500): ... 11 more 
    08-05 17:03:51.408: W/PrintK(1500): m.vahid.davoudi(1500) sends SIGKILL to  m.vahid.davoudi(1500) 

这是我的清单

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.vahid.davoudi" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> 
<uses-permission android:name="android.permission.CALL_PHONE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-sdk android:minSdkVersion="8" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:name=".Mainclass" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 


    <activity 
     android:name=".CallBlockingOrginalActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".ViewDatabase" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.VIEWDB" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 

    <receiver android:name=".CallblockingActivity"> 
     <intent-filter > 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
    </receiver> 

    <receiver android:name=".FilterCall"> 
     <intent-filter android:priority="100" > 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
    </receiver> 
    </application> 

</manifest> 

回答

1

你必须要在行一个NullPointerException Mainclass.java

的39

这是可能是 “b”,则返回null

Intent b = getIntent(); 

添加

if(b != null) { 
    //code involving the use of b 
} 
1

一些建议,你的问题,

1)你不需要添加在自己的广播接收器,许多代码以获取来电号码。而你可以直接使用下面的代码来获得这个。

String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 

2)你不需要启动活动在数据库中搜索,您可以直接在数据库中从接收方法接收器搜索这个号码(希望你的数据库是不是太大这可能需要更多的时间来导致ANR)

3)你可以直接做你在做什么在另一个接收器只在第一个接收器。它将会删除大量的代码并使其成为一种好方法。

代码中的地方问题,您使用下面的代码来发送广播消息

// I think My problem is here 
     Intent in = new Intent(context, FilterCall.class); 
     Bundle bb = new Bundle(); 
     bb.putString("keyvalue", "ss"); 
     in.putExtras(bb); 
     startActivity(in); 

但你调用startActivity代替sendBroadcast方法的原因FilterCall是一个广播接收器。

你应该做的事情这

 Intent in = new Intent("Intent Action which your receiver is listening to"); 
     in.putExtras("keyvalue", "ss"); 
     sendBroadcast(in); 
+0

亲爱@Ankit感谢您的建议一样,但你是什么意思,我可以直接在搜索从接收机接收这个数据库的数量,你请对子级告诉我如何因为在第一个BroadcastReceiver中,我只是接收来电号码,并通过发送intent来启动新的Activity,所以如何将结果返回到同一个broadCastReceiver中,请给我一个例子。对于我可怜的英语感谢。 – developer 2012-08-05 10:39:57

+0

你的英文不是很差,你的Android和Java基础很差,我不能在这里教。你应该首先学习Java基础知识,然后阅读Android文档......对于本地问题,再次查看我的更新答案。 – AAnkit 2012-08-05 10:56:26

+0

亲爱的@Ankit,是的,你是对的,谢谢你的伟大帮助解决我的问题。我的问题解决:) – developer 2012-08-05 16:05:57

相关问题