0

나는 그것에 대한 도움이 필요하다. 나는 같은 질문을 하나 더 발견했지만 나에게 그다지 도움이되지 못했다. 오디오 관리자 nullpointerexception in service

import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.media.AudioManager; 
import android.net.Uri; 
import android.os.Handler; 
import android.os.IBinder; 
import android.provider.CallLog; 
import android.provider.ContactsContract; 
import android.telephony.PhoneStateListener; 
import android.telephony.TelephonyManager; 
import android.util.Log; 
import android.widget.ArrayAdapter; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Scanner; 

public class CallDetector extends Service { 

    static String[] test = new String[15]; 
    boolean isstart = false; 
    AudioManager audio_mng; 

     private static final String DEBUG_TAG = "InviteActivity"; 

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

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

     CallDetector calldetector= new CallDetector(this); 

     Log.v(DEBUG_TAG, "Service start"); 

     int i = 0; 
     File file = new File("pathtofile/myfile.txt"); 

     try { 
      Scanner scaner = new Scanner(new FileReader(file)); 
      BufferedReader br = new BufferedReader(new FileReader(file)); 
      String line; 

      do{ 
       line = scaner.nextLine(); 
       test[i] = line; 

       i++; 

       br.close(); 
      }while(scaner.hasNext()); 
     } 
     catch (IOException e) { 
      //You'll need to add proper error handling here 
     } 

     calldetector.start(); 
     return START_STICKY; 
    } 

    public void onDestroy(){ 
     CallDetector calldetector = new CallDetector(this); 

     calldetector.stop(); 
     super.onDestroy(); 
    } 

    public void onCreate(){ 
     super.onCreate(); 
     audio_mng = (AudioManager) getBaseContext().getSystemService(ctx.AUDIO_SERVICE); 
    } 

     private class PhoneCallListener extends PhoneStateListener { 

      private boolean isPhoneCalling = false; 

      @Override 
      public void onCallStateChanged(int state, String incomingNumber) { 

       if (TelephonyManager.CALL_STATE_RINGING == state) { 

        for(int i =0; i <15; i++) { 
         if (incomingNumber.equals(test[i])) { 
          Log.v(DEBUG_TAG, "OK"); 
          onchangetonormal(); 
         } 
        } 

       } 
      } 
     } 

     private Context ctx; 
     private TelephonyManager tm; 
     private PhoneCallListener callStateListener; 

     public void onchangetonormal(){ 
      audio_mng.setRingerMode(AudioManager.RINGER_MODE_NORMAL); 
     } 

     public CallDetector(Context ctx) { 
      this.ctx = ctx; 

      callStateListener = new PhoneCallListener(); 
     } 

     /** 
     * Start calls detection. 
     */ 
     public void start() { 
      Log.v(DEBUG_TAG, "Start listening"); 
      tm = (TelephonyManager)  ctx.getSystemService(Context.TELEPHONY_SERVICE); 
      tm.listen(callStateListener, PhoneStateListener.LISTEN_CALL_STATE); 
     } 

     /** 
     * Stop calls detection. 
     */ 
     public void stop() { 
       tm.listen(callStateListener, PhoneStateListener.LISTEN_NONE); 
     } 

    } 

내가 오류하지만 서비스를받을 서비스의 실행에 전화를받을

가 계속 실행 :

내 코드를 이잖아.

if (TelephonyManager.CALL_STATE_RINGING == state) { 

        for(int i =0; i <15; i++) { 
         if (incomingNumber.equals(test[i])) { 
          Log.v(DEBUG_TAG, "OK"); 
AudioManager audio_mng; 
audio_mng = (AudioManager) getBaseContext().getSystemService(ctx.AUDIO_SERVICE); 
audio_mng.setRingerMode(AudioManager.RINGER_MODE_NORMAL); 
         } 
        } 

       } 

모든에 있던 전화로 전화를받을 때의 경우 : 내 첫 번째 코드에서

이이었다! 내가 말했듯이 해결책을 찾았습니다. 그리고 나는 그들을 onCreat에 넣으려고 시도합니다.

편집 :

FATAL EXCEPTION: main 
    java.lang.NullPointerException 
      at com.test.testapp.CallDetector.onchangetonormal(CallDetector.java:156) 
      at com.test.testapp.CallDetector$PhoneCallListener.onCallStateChanged(CallDetector.java:107) 
      at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:393) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4867) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 
      at dalvik.system.NativeStart.main(Native Method) 

감사합니다!

그리고 나쁜 영어로 유감스럽게 생각합니다!

+0

어떤 오류가 발생합니까? 응용 프로그램이 충돌하는 경우 질문과 함께 로그를 추가하십시오 –

+0

나는 오류를 추가하겠습니다. 그래, 충돌하지만 끈적 거리는 내가 다시 시작한다고 생각한다. – NinjTsax

답변

0

내가 AudioManager audio_mng 정적으로 선언하려면 .... 작동 을 .... 오늘 을 아이디어가!

다른 설명이나 다른 대답이 있거나 그 이유가 무엇인지 대답하십시오.

관심을 가져 주셔서 감사합니다.

0

NullPointerException 에서처럼, onchangetonormal에서 예외가 발생하는 방법은 audio_mngnull입니다.

onchangetonormal 방법 audio_mng 객체를 사용하기 전에 NULL 체크를 넣어 :

if(audio_mng==null){ 
    audio_mng=(AudioManager)CallDetector.this.getSystemService(
                 Context.AUDIO_SERVICE); 
} 
+0

아무 것도 ...이 줄은 onCreate에 있으므로 여기에 넣는다. 또한 시도해보십시오. if (audio_mng == null) { Log.v (DEBUG_TAG, "audiomanager"+ audio_mng); } onCreat의 이므로 null 인 경우 메시지가 표시됩니다. 하지만 아무것도 보이지 않으므로 null이 아닙니다. – NinjTsax

+0

@ NinjTsax :'onchangetonormal' 메소드에서 제안 코드를 사용하면 어떻게됩니까? –

+0

나는 네가 나에게 무엇을 요구하는지 정확히 이해하지 못했다. 하지만 권한에 대해 생각합니다. 나는 이미 폰 상태에 대한 허가를 가지고 있지만 가능한 서비스에는 별도의 허가가 필요합니까? – NinjTsax