2016-07-19 4 views
1

Я отправляю намерение от «активности» к получателю в «услуге» (и передаю данные). Мой код имеет активность и обслуживание (у которого есть приемник). Приемник объявлен следующийAndroid: отсутствует информация о «дополнительных» в намерении

<receiver android:name="xxx" 
     android:enabled="true" > 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
      <!-- protected intents meant for os and not for us <action android:name="android.intent.action.ACTION_NEW_OUTGOING_CALL" android:priority="0" /> --> 
     </intent-filter> 

    </receiver> 

активности определяются следующим образом

<activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" 
     android:launchMode="singleTask" 
     android:screenOrientation="portrait" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

Я рассмотрел Use an intent to send data to my activity

Намерения Я вызов является намерением вызова и передачи номера вызова назначения, со следующим код

Log.e(TAG,"Calling "+number); 
    Intent callIntent = new Intent(Intent.ACTION_CALL); //ACTION_NEW_OUTGOING_CALL is deprecated in API 21, hence ACTION_CALL   
    callIntent.putExtra("PHONE_NUMBER",number); 
    number = "tel:"+number; 
    callIntent.setData(Uri.parse(number)); 
    startActivity(callIntent); 

Выше код успешно делает телефонный звонок из моего приложения. У меня также есть приемник для перехвата вызовов, и приемник перехватывает вышеуказанный вызов просто отлично. Однако в приемнике отсутствуют «дополнительные функции» вышеуказанного намерения; Я всегда получаю «PHONE_NUMBER» в нуле в следующем коде

@Override 
public void onReceive(Context context, Intent intent) { 
     //blah blah.. 
savedNumber = intent.getExtras().getString("PHONE_NUMBER"); 
if(savedNumber == null) 
     savedNumber = intent.getStringExtra("PHONE_NUMBER"); 
Log.e(TAG, " savedNumber = "+savedNumber); 
} 

Что моя ошибка, и почему это я получаю намерение в приемнике, но «Extras» отсутствует (как вы, возможно, заметили, я попытался чтобы получить его в обоих направлениях от намерения)

ответ

0

getIntent() - метод класса Activity. Вы можете видеть, что в методе onReceive() есть аргумент намерения, вы получаете строку из этого.

String number = null; 
number = intent.getStringExtra("PHONE_NUMBER"); 

Но я прочитал эту статью: How to pass Extra to BroadcastReceiver, when initiating ACTION_CALL Только Android сама система может транслировать NEW_OUTGOING_CALL Intent. Вы не можете добавлять свои собственные дополнения в это намерение. Вам нужно придумать другой способ сделать то, что вы пытаетесь выполнить.

+0

NEW_OUTGOING_CALL - это защищенная цель. Следовательно, я не использую NEW_OUTGOING_CALL, как вы можете видеть в моем фрагменте xml – mobileDev

+0

О, извините за ошибку, ACTION_CALL также является защищенным действием :) Это позволяет вам называть телефонный номер напрямую, без взаимодействия с пользователем. Это риск для безопасности, поэтому он «защищен» разрешением. Вы также заметите, что Manifest.permission не определяет это разрешение публично: это намеренно внутри системы. – alway5dotcom

1

Попробуйте это:

Intent intent = context.getIntent(); 
savedNumber = intent.getStringExtra("PHONE_NUMBER"); 
+0

Я не могу назвать «this.getIntent», потому что код находится в режиме «onReceive» в приемнике, а не в действии (отредактирован последний код, отрезанный в моей публикации) – mobileDev

+0

@statosdotcom - вместо этого «это» должно быть context – cafebabe1991

+0

@kashili, используйте контекст вместо «this» здесь – cafebabe1991

0

Начало службы, как this-

Intent callIntent=new Intent(this, Service.class); 
callIntent.putExtra("phonenumber",number); 
this.startService(callIntent); 

Затем извлекать данные из службы;

data=(String) intent.getExtras().get("phonenumber"); 

Вы можете получить доступ к параметру либо из onHandleIntent или onStartCommand Intent параметра.

служба

protected void onStartCommand (Intent intent, int flags, int startId) { 
data=(String) intent.getExtras().get("data"); 
} 

IntentService

protected void onHandleIntent(Intent intent) { 
data=(String) intent.getExtras().get("data"); 
} 

Это зависит от того, какой тип обслуживания вы работаете.

+0

Нет, я не могу начать сервис, как вы предложили. Поскольку обработчик действия кнопки вызывает намерение вызова (несколько раз). Вы предполагаете, что я знаю число «дополнительных» для намерения перед началом службы. – mobileDev

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