2016-12-12 4 views
-1

Ich versuche, eine App für die bedingte Anrufumleitung zu entwickeln, wenn der Teig für bestimmte Netzwerkanbieter, die die bedingte Anrufumleitung nicht unterstützen, auf ein bestimmtes Niveau sinkt. Ich bin nur ein Anfänger. Bitte hilf mir. Weil wir den Service oder etwas anderes nicht anrufen können, überprüfen Sie bitte die Fehlermeldung und schlagen Sie sorgfältig vor. Es wäre eine große Hilfe für mich. mein Service geht soWarum stürzt meine Android-App beim Ausführen dieses Dienstes ab?

package com.cospirit.nonprogress; 
    import android.Manifest; 
    import android.app.Service; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.content.IntentFilter; 
    import android.content.SharedPreferences; 
    import android.content.pm.PackageManager; 
    import android.net.Uri; 
    import android.os.BatteryManager; 
    import android.os.IBinder; 
    import android.support.v4.app.ActivityCompat; 

    public class MyService extends Service { 


     IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
     Intent batteryStatus = getApplicationContext().registerReceiver(null, ifilter); 
     boolean charginginfo = false; 
     SharedPreferences spdf1 = getSharedPreferences("divertInfo", Context.MODE_PRIVATE); 
     String numberDivert; 
     int batterylevel = Integer.parseInt(spdf1.getString("battery_Level", "")); 
     boolean divert ; 


    public MyService() 
    {} 
     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 

      Runnable r = new Runnable() { 
       public void run() { 
        int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
        int chargingStatus = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 
        charginginfo = chargingStatus == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; 
        divert = false; 
        synchronized (this) { 
         while (status > 30 || charginginfo == true) { 
          if (divert == true) { 
           cancelDivert(); 
           divert = false; 
           status = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
          } 


         } 
         while (batterylevel < status && status < 30 && charginginfo == false) { 
          if (divert == true) { 
           cancelDivert(); 
           divert = false; 
           status = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
          } 


         } 
         while ((status < batterylevel || status == batterylevel) && charginginfo == false) { 
          if (divert == false) { 
           divertCalls(); 
           divert = true; 
           status = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
          } 
         } 
        } 
       } 



      }; 
      Thread tr = new Thread(r); 
      tr.start(); 
      return START_REDELIVER_INTENT; 
     } 




     public void divertCalls() { 
      try { 


       spdf1 = getSharedPreferences("divertInfo", Context.MODE_PRIVATE); 
       numberDivert = spdf1.getString("phone_details", ""); 
       Intent intent = new Intent(Intent.ACTION_CALL); 
       intent.setData(Uri.parse("**21*" + numberDivert + "#")); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       intent.addFlags(Intent.FLAG_FROM_BACKGROUND); 
       if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { 
        // TODO: Consider calling 
        // ActivityCompat#requestPermissions 
        // here to request the missing permissions, and then overriding 
        // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
        //           int[] grantResults) 
        // to handle the case where the user grants the permission. See the documentation 
        // for ActivityCompat#requestPermissions for more details. 
        return; 
       } 
       startActivity(intent); 


      } 
      catch(Exception ep) 
      { 
       ep.printStackTrace(); 
      } 
     } 
     public void cancelDivert() { 
      try { 
       Intent intents = new Intent(Intent.ACTION_CALL); 
       intents.setData(Uri.parse("#21#")); 
       intents.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       intents.addFlags(Intent.FLAG_FROM_BACKGROUND); 
       if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { 

        return; 
       } 
       startActivity(intents); 
      } 
      catch(Exception ep) 
      { 
       ep.printStackTrace(); 
      } 
     } 
     @Override 
     public void onDestroy() { 
      super.onDestroy(); 
     } 

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

XML-Manifest

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

    <uses-permission android:name="android.permission.CALL_PHONE" /> 
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     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=".MyService" 
      android:enabled="true" 
      android:exported="true"></service> 
    </application> 

</manifest> 

Fehler msg

12-13 01:08:23.222 12033-12033/com.cospirit.nonprogress E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.cospirit.nonprogress, PID: 12033 
                      java.lang.RuntimeException: Unable to instantiate service com.cospirit.nonprogress.MyService: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference 
                       at android.app.ActivityThread.handleCreateService(ActivityThread.java:2862) 
                       at android.app.ActivityThread.-wrap4(ActivityThread.java) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1427) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:148) 
                       at android.app.ActivityThread.main(ActivityThread.java:5417) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference 
                       at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:107) 
                       at com.cospirit.nonprogress.MyService.<init>(MyService.java:19) 
                       at java.lang.Class.newInstance(Native Method) 
                       at android.app.ActivityThread.handleCreateService(ActivityThread.java:2859) 
                       at android.app.ActivityThread.-wrap4(ActivityThread.java)  
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1427)  
                       at android.os.Handler.dispatchMessage(Handler.java:102)  
                       at android.os.Looper.loop(Looper.java:148)  
                       at android.app.ActivityThread.main(ActivityThread.java:5417)  
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
+0

Was sagt die Logcat-Fehlermeldung? – ianhanniballake

+0

bearbeitet bitte helfen –

+0

'OnBind (Intent Intent)' gibt null zurück ... das wird sicherlich ein Problem sein. Es ist die 'IBinder'-Schnittstelle, die es einer Anwendung ermöglicht, mit dem Dienst zu sprechen ... –

Antwort

0

Verschieben getApplicationContext().registerReceiver(null, ifilter); zu Ihrem onStartCommand

Auch Service ist ein Context ist. Einfache Verwendung this.registerReceiver(null, ifilter);

+0

Ich habe dieses Stück Code in Service-Methode, dh onStartCommand, aber die Fehler bleiben noch. Bitte helfen Sie –