2

나는 그토록 많은 것을 찾고 있었으며 해결책을 찾지 못했습니다.추가 기능이있는 브로드 캐스트 수신기의 의도 (서비스 관련 문제)

내 응용 프로그램은 항상 전화를 걸고 정확히 전화를 걸면 수신이 중지됩니다. 내 생각이 있다는 것입니다 :

  1. 활동 걸려 오는 전화 그래서

에 대한 기대

  • 브로드 캐스트 리시버를 호출의 작업을 수행 서비스를 시작, 내가 죽일하기 위해 브로드 캐스트 리시버를 사용하려면 활동,하지만 난 이것에 대한 해결책을 찾지 못했습니다. 다른 것을 시도하기 위해 Extras와 Intent를 보내려고했으나 Extras가 null이되었습니다.

    다른 해결 방법을 사용하고 있습니다.

    고마워요!

    그래서

    여기에 내 코드 내 모든 코드를 삽입, 내가 문제가 호출을 서비스에 있음을 볼 커티스 Nusbaum의 추천을 할 업데이트 된 코드 :

    package com.comunicacio; 
    
    import android.app.Activity; 
    import android.content.BroadcastReceiver; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.content.IntentFilter; 
    import android.os.Bundle; 
    import android.util.Log; 
    
    public class Comunicacio extends Activity { 
    
        IntentFilter filter; 
    
        private BroadcastReceiver receiver = new BroadcastReceiver() { 
         @Override 
         public void onReceive(Context context, Intent intent) { 
          Log.i("BYE", "OOOOOOOOOOOOK"); 
          finish(); 
         } 
        }; 
    
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.main); 
    
         filter = new IntentFilter(); 
         filter.addAction("com.comunicacio.FINALITZAR"); 
    
         startService(new Intent(this, Servicio.class)); 
        } 
    
        @Override 
        protected void onResume() { 
         super.onResume(); 
         registerReceiver(receiver, filter); 
        } 
    
        @Override 
        protected void onPause() { 
         super.onPause(); 
         unregisterReceiver(receiver); 
        } 
    
    } 
    

    BroadcastReceiver : package com.comunicacio;

    import android.content.BroadcastReceiver; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.os.Bundle; 
    import android.telephony.TelephonyManager; 
    import android.util.Log; 
    
    public class DetectarCridada extends BroadcastReceiver { 
        public static final String CUSTOM_INTENT = "com.comunicacio.FINALITZAR"; 
    
        @Override 
        public void onReceive(Context context, Intent intent) { 
         Bundle bundle = intent.getExtras(); 
    
         if (bundle == null) 
          return; 
    
         String state = bundle.getString(TelephonyManager.EXTRA_STATE); 
    
         if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)) { 
          String phonenumber = bundle 
            .getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 
    
          Log.i("BYE", "UUUUUUUUUUUUUUUUL"); 
    
          // if (es_acceptat(phonenumber)) { 
          Intent i = new Intent(); 
          i.setAction(CUSTOM_INTENT); 
          context.sendBroadcast(i); 
          // } 
         } 
        } 
    
        private boolean es_acceptat(String telefono) { 
         if (telefono.equals("123")) 
          return true; 
         return false; 
        } 
    } 
    

    그리고 매니페스트 :

    <uses-sdk android:minSdkVersion="10" /> 
    
        <application 
         android:icon="@drawable/ic_launcher" 
         android:label="@string/app_name" > 
         <activity 
          android:label="@string/app_name" 
          android:name="Comunicacio" > 
          <intent-filter > 
           <action android:name="android.intent.action.MAIN" /> 
           <category android:name="android.intent.category.LAUNCHER" /> 
          </intent-filter> 
         </activity> 
    
         <receiver android:name=".DetectarCridada" > 
          <intent-filter > 
           <action android:name="android.intent.action.PHONE_STATE" /> 
          </intent-filter> 
         </receiver> 
         <service 
          android:enabled="true" 
          android:name=".Servicio" /> 
    
         <activity android:name=".Call" /> 
        </application> 
    
        <uses-permission android:name="android.permission.CALL_PHONE" /> 
        <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    </manifest> 
    

    본 서비스 Sercivio.java : 패키지 com.comunicacio;

    import android.app.Service; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.os.IBinder; 
    import android.telephony.PhoneStateListener; 
    import android.telephony.TelephonyManager; 
    import android.util.Log; 
    import android.widget.Toast; 
    
    public class Servicio extends Service { 
        private static final String TAG = "MyService"; 
        boolean hem_cridat = false; 
        int telefono = 123; 
    
        @Override 
        public IBinder onBind(Intent intent) { 
         return null; 
        } 
    
        @Override 
        public void onCreate() { 
         Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
         Log.d(TAG, "onCreate"); 
         EndCallListener callListener = new EndCallListener(); 
         TelephonyManager mTM = (TelephonyManager) this 
           .getSystemService(Context.TELEPHONY_SERVICE); 
         mTM.listen(callListener, PhoneStateListener.LISTEN_CALL_STATE); 
        } 
    
        @Override 
        public void onDestroy() { 
         Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
        } 
    
        @Override 
        public void onStart(Intent intent, int startid) { 
         Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
         call(); 
        } 
    
        private class EndCallListener extends PhoneStateListener { 
         private static final String LOG_TAG = "Comunicacio:"; 
    
         @Override 
         public void onCallStateChanged(int state, String incomingNumber) { 
          switch (state) { 
          case TelephonyManager.CALL_STATE_RINGING: 
           Log.i(LOG_TAG, "RINGING, number: " + incomingNumber); 
           break; 
          case TelephonyManager.CALL_STATE_OFFHOOK: 
           Log.i(LOG_TAG, "OFFHOOK"); 
           hem_cridat = true; 
           break; 
          case TelephonyManager.CALL_STATE_IDLE: 
           Log.i(LOG_TAG, "IDLE"); 
           if (hem_cridat) { 
            hem_cridat = false; 
            try { 
             Log.i(LOG_TAG, "Cridant!"); 
             call(); 
            } catch (Exception e) { 
             e.printStackTrace(); 
            } 
           } 
           break; 
          } 
         } 
        } 
    
        private void call() { 
        /* THE PROBLEM IS THERE !!! If I don't do that, it works! */ 
        /* Intent i = new Intent(getBaseContext(), Call.class); 
         i.putExtra("NUMERO", telefono); 
         i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         getApplication().startActivity(i); 
         ++telefono; */ 
        } 
    } 
    

    그리고 마지막으로 Call.java : 패키지 com.comunicacio;

    import android.app.Activity; 
    import android.content.Intent; 
    import android.net.Uri; 
    import android.os.Bundle; 
    
    public class Call extends Activity { 
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         Bundle b = getIntent().getExtras(); 
         Intent i = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" 
           + b.getInt("NUMERO"))); 
         startActivity(i); 
        } 
    } 
    

    고마워요!

  • +0

    나는 것을 보았다 문제는 서비스에 있으므로 어떤 도움이 필요하다고 코드를 추가합니다! – kanashin

    답변

    1

    문제가 있었다 : 여기

    은 일부 의사 코드의 그것은 수신기를 중지

    @Override 
    protected void onPause() { 
        super.onPause(); 
        unregisterReceiver(receiver); 
    } 
    

    , 그래서 나는 그것을 변경 :

    @Override 
    protected void onDestroy() { 
        super.onDestroy(); 
        unregisterReceiver(receiver); 
    } 
    
    4

    브로드 캐스트 리시버에서 작업 및 활동을 완료하려면 특정 의도를 수신하는 다른 브로드 캐스트 리시버를 활동에 작성하십시오. 그런 다음 첫 번째 브로드 캐스터 수신기에서 활동을 죽이고 싶을 때 활동의 수신기가 듣고있는 인 텐트를 브로드 캐스트합니다. 그러면 수신자가 활성화되어 모든 활동을 마칠 수 있습니다.에

    public class YourActivity extends Activity{ 
    
        private class CloseLisntener extends BroadcastReceiver{ 
        onReceive(Contetxt context, Intent intent){ 
         YourActivity.this.finish(); 
        } 
        } 
    
        private CloseListener closeListener; 
    
        protected void onCreate(Intent icicle){ 
        closeListener = new CloseListener(); 
        // other on create stuff 
        } 
    
        protected void onResume(){ 
        registerReceiver(closeListener, /* Your intent filter goes here */); 
        } 
    
        protected void onPause(){ 
        unregisterReceiver(closeListener); 
        } 
    } 
    
    +0

    고맙습니다. 그렇게하려면 [link] (http://stackoverflow.com/questions/4555215/android-broadcastreceiver-within-activity)와 매우 유사한 작업을 수행했으며 sendBroadcast를 수신하지 않습니다. 아마도 매니페스트 (Manifest)에서 나온 것이 있을까요? sendBroadcast를 사용하고 succes를 사용하여 Activity에서 수신하는 완전한 예제가 있습니까? 다시 감사합니다! – kanashin

    +0

    환영합니다. 도움이된다면 답변을 수락하십시오. –

    +0

    고맙지 만 해결되지는 않았지만 권장 사항을 사용하여 첫 번째 메시지의 코드를 업데이트했지만 여전히 작동하지 않습니다! 고맙습니다! – kanashin

    관련 문제