6

为什么OrderedBroadcast可以在应用程序的调试版本中工作,但不能在发布版本中工作?我送以下OrderedBroadcast:Android OrderedBroadcast不能在发布版本中工作

context.sendOrderedBroadcast(sendInt, "xxx.xxxx.permission.API", new BroadcastReceiver() { 
     @SuppressLint("NewApi") 
     @Override 
     public void onReceive(Context receivercontext, Intent intent) { 
       Bundle results = getResultExtras(true); 
       if (results.getInt("Result", Activity.RESULT_CANCELED) == Activity.RESULT_OK) { 
        Log.d("DEBUG", "OK"); 
       } else { 
        Log.e("DEBUG", "Failed"); 
       } 
     } 
}, null, Activity.RESULT_OK, null, null); 

这两个应用程序都在AndroidManifest.xml文件中适当的权限和接收声明如下:

<receiver android:name="xxx.xxxx.xxxx.Receiver1" 
      android:enabled="true" 
      android:exported="true" 
      android:permission="xxx.xxxx.permission.API"> 
      <intent-filter> 
       <action android:name="xxx.xxxx.permission.API.1" /> 
      </intent-filter> 
</receiver> 

正如我所说,如果我有发送方和接收器应用程序在调试版本中运行,然后一切正常,但如果我运行接收器应用程序在发布模式(没有proguard或任何东西)发件人应用程序只是得到RESULT_CANCELLED结果?

这已经给我留了好几天的时间,所以任何想法都将不胜感激。

+0

权限问题?在''中添加权限,刚刚发现它[这里](http://developer.android.com/intl/es/reference/android/content/BroadcastReceiver.html#Security) – calvinfly

+0

你是依靠结果值?接收器触发器的接收器?或执行? – Elltz

+0

该权限已被使用,我已经重新检查了这些,我依靠接收来自第二个应用的OK响应,接收器不会触发或执行,除非我在调试模式下运行接收器应用程序? – Apqu

回答

1

好了,所以经过一番搜索和试验结果证明它是安卓造成这个错误比较简单但烦人的安全功能:

已安装只能接收和行为上的广播(无论是正常还是应用如果它是第一次在设备上打开,则命令广播)。在我的情况下,调试版本在运行时自动打开,但发布版本不是,它没有任何应用程序图标仅作为主应用程序的扩展,因此从未打开过。

因此,修正是为接收应用程序提供应用程序图标,并确保它在设备上运行。奇怪的是,在logcat中没有产生安全错误,除非你知道这种事情,否则很难调试!

0

听起来像当你声明权限时,你正在使用android:protectionLevel="signature"。如果您在调试中运行发送方,则会使用您的调试密钥进行签名。接收器将使用释放密钥进行签名。因此,签名将不匹配,并且接收者将不会被授予权限。

您需要在发布模式下运行,以便它们都使用相同的密钥进行签名。

+0

非常感谢您的回答我会在早上回到我的电脑,所以会检查是否是问题,如果是的话,我会标记为答案并奖励赏金,再次感谢 – Apqu

相关问题