【问题标题】:Missing 'extras' data in intent意图中缺少“额外”数据
【发布时间】:2016-07-19 02:28:12
【问题描述】:

我正在从“活动”向“服务”中的接收者发送意图(并传递数据)。我的代码有活动和服务(有接收者)。接收者声明如下

 <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定义如下

   <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);
}

我的错误是什么,为什么我在接收者中获得了意图,但缺少“附加”(您可能已经注意到,我试图从意图中获得两种方式)

【问题讨论】:

    标签: android


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 我无法调用“this.getIntent”,因为代码在接收器中的“onReceive”方法中,而不是在活动中(编辑了我帖子中截取的最后一个代码)
    • @statosdotcom - 应该是上下文而不是“this”
    • @kashili ,在这里使用上下文而不是“this”
    • 这是我开始写给 kas hili 的内容。 @cafebabe1991,谢谢,我没有写上下文,因为问题在实际版本之前没有显示。我也会编辑我的答案。
    • 是的,我明白了。
    【解决方案2】:

    getIntent() 是 Activity 类的方法。你可以在 onReceive() 方法中看到一个 intent 参数,你可以从中获取字符串。

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

    但我读到这篇文章:How to pass Extra to BroadcastReceiver, when initiating ACTION_CALL 只有 Android 系统本身可以广播 NEW_OUTGOING_CALL Intent。 您不能将自己的附加内容添加到此 Intent。你需要想出另一种方法来完成你想要完成的任何事情。

    【讨论】:

    • NEW_OUTGOING_CALL 是受保护的意图。因此,我没有使用 NEW_OUTGOING_CALL,正如您在我的 xml sn-p 中看到的那样
    • 哦,很抱歉弄错了,ACTION_CALL 也是一个受保护的操作 :) 它允许您直接拨打电话号码,无需用户交互。这是一个安全风险,因此它受到许可的“保护”。您还会注意到 Manifest.permission 并未公开定义该权限:这是系统内部有意为之的。
    【解决方案3】:

    像这样启动服务-

    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"); 
    }
    

    意图服务

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

    这取决于您正在运行的服务类型。

    【讨论】:

    • 不,我无法按照您的建议启动服务。因为按钮的操作处理程序会调用调用意图(多次)。您假设在启动服务之前我知道意图的数字“附加”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    相关资源
    最近更新 更多