2016-12-12 1 views
-1

조건부 호출 전환을 지원하지 않는 네트워크 공급자가 특정 수준으로 이동하면 조건부 호출 전환을위한 앱을 개발하려고합니다. 나는 단지 시작이다. 도와주세요. 서비스에서 전화를 걸 수 없기 때문에 오류 메시지를 확인하고주의 깊게 제안하십시오. 그것은 나를 위해 큰 도움이 될 것입니다. 내 서비스는 또한 서비스가 문맥 당신의 onStartCommand왜이 서비스를 실행하는 동안 내 Android 앱이 다운 되나요?

에 매니페스트이

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

<?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> 

오류 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

logcat 오류 메시지의 내용은 무엇입니까? – ianhanniballake

+0

편집 도움주세요 –

+0

'onBind (Intent intent)'는 null을 반환합니다 ... 확실히 문제가 될 것입니다. 애플리케이션이 서비스와 통신 할 수있게 해주는 IBinder 인터페이스입니다 ... –

답변

0

이동 getApplicationContext().registerReceiver(null, ifilter);처럼 간다. 간단한 사용 this.registerReceiver(null, ifilter);

+0

서비스 메서드 (예 : onStartCommand)에 코드 조각을 넣었지만 오류는 여전히 남아 있습니다. 도와주세요 –

관련 문제