2012-08-05 4 views
0

Я работаю над своим окончательным проектом, пожалуйста, помогите мне, я должен представить его до конца следующей недели im работает над приложением, которое фильтрует входящие вызовы на основе контекста, сначала i хочу принять входящий номер и перейти к Activity для поиска номера на базе данных и вернуть результат, я не знаю, как получить переменную извещателя и передать его снова, я имею в виду получить и передать переменную только 1 broadcastReceiver, поэтому я решил используйте 2 BroadCastReceiver, из них возьмите входящий номер и перейдите к моему основному классу, и мои mainCalss ищут входящий номер в базе данных и передают результат фильтруемому классу вещания, но я столкнулся с проблемой .please help me, tHXКак передать переменную broadCastReceiver

Это мой класс CallActivity Broadcast, который принимает входящее число Бер и перейти к моему 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 в строке 39 из Mainclass.java

Это возможно, что «b» возвращает значение null

Intent b = getIntent(); 

добавить

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

Некоторые рекомендации для вашей проблемы,

1) вам не нужно добавить, что много кода в вашем приемнике Broadcast, чтобы получить входящий номер. в то время как вы можете напрямую использовать код ниже, чтобы получить это.

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 является Broadcast Receiver.

вы должны сделать что-то вроде этого

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

дорогого @Ankit спасибо за ваше предложение, но то, что вы имеете в виду я могу сразу найти этот номер на базе данных из приемников на получение и whould скажите, пожалуйста, как используйте только один broadCastReceiver, потому что в первом BroadcastReceiver я просто беру входящий номер и запускаю новую активность, отправляя намерение, так как можно вернуть результат в том же широковещательном_последователе, не могли бы вы дать мне пример. Исправьте мой плохой английский. – developer

+0

ваш английский не беден, какова беда ваша основа Android и Java, я не могу преподавать здесь. вы должны сначала изучить основы Java, а затем прочитать документы для Android ... для локальной проблемы снова см. мой обновленный ответ. – AAnkit

+0

дорогой @ Анкит, да, вы правы, СПАСИБО ЗА ВАШУ БОЛЬШУЮ ПОМОЩЬ В РЕШЕНИИ МОИХ ПРОБЛЕМ. Проблема решена :) – developer

Смежные вопросы