如何从 Google Play 服务通知中检测意图
Posted
技术标签:
【中文标题】如何从 Google Play 服务通知中检测意图【英文标题】:How to detect intent from Google Play Services Notification 【发布时间】:2014-12-08 08:25:00 【问题描述】:我有一个带有 google play 服务的应用程序(回合制游戏),但我的主要活动没有 google play 连接。
Google Play 连接处于单独的活动中。我不想强迫我的用户连接,如果他们不想的话,我不能把所有相关的东西放在我的主要活动中。
我的问题是:
-
有人给我发邀请
我收到通知
通知会将我重定向到默认的 google play 活动以接受此邀请
我接受并重定向到我的应用的主要活动。
接受邀请后如何检测重定向?
因为我的主要活动与 Google Play 无关,所以我不能只使用
@Override
public void onConnected(Bundle connectionHint)
if (connectionHint != null)
mMatch = connectionHint.getParcelable(Multiplayer.EXTRA_TURN_BASED_MATCH);
我在不同的设备上得到了不同的意图,但我所有的设备都有 flg=0x14000000
意图act=android.intent.action.MAIN flg=0x14000000 cmp=com.virag.game/.Activities.MainActivity
所以现在我在我的主要活动中使用它并且它有效:
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
Intent data = getIntent();
if ( data != null && data.getFlags() == 0x14000000)
// NetGameActivity is activity with google play connection
Intent intent = new Intent(this, NetGameActivity.class);
startActivity(intent);
但这感觉像是一种黑客行为,我想这个标志在某些设备上可能会有所不同。那么,是否可以通过清单来完成,或者是否有其他方式可以知道您刚刚从 Google Play 服务“接受邀请菜单”获得了意图?
【问题讨论】:
But it feels like a hack..
因为它是。我不明白你想在这里完成什么。你说如果他们不想的话,你不希望他们使用 Google Play 服务……好吧,那就让他们选择连接吧。你在做什么看起来很傻
我想要 1) 自动连接并将用户重定向到已接受的游戏,即使他之前已注销,并且 2) 如果只是手动登录,则不要连接(也许他想玩单人游戏)。但我不知道如何检测(在连接到 GP 之前)他刚刚接受了一些游戏邀请。但是,是的,也许我应该忘记这一点并连接我的主要活动。
是的,我有 2 个按钮“单人游戏”、“在线游戏”,用户必须选择其中之一。但我想检测到该用户在 GPS 连接之前刚刚接受了游戏,如果是,则自动将他重定向到网络游戏。
@varren,我认为你所说的一切都是有道理的。为什么不能有一种方法可以确定,在玩游戏服务时知道 GPS 的意图是否是启动我们的 MainActivity 的意图?如果你设法解决了,请告诉我。
@user3833732 我刚刚放弃并在该应用程序中使用了 flg=0x14000000 标志破解,而其他所有应用程序都在我的主要活动中使用了 GPS。目前我根本不使用谷歌播放服务......这些天更喜欢我自己的服务器来托管游戏,所以不能建议
【参考方案1】:
连接到 Google Play 服务本身不需要用户交互。在example connecting code 之后,如果用户已经登录(我假设他们在回合制游戏中就是这种情况),那么onConnected()
将被调用而无需用户执行任何操作,然后您就可以继续获得游戏。
如果他们没有登录,则将调用onConnectionFailed()
,但不要求您立即调用startResolutionForResult()
来启动登录过程 - 您可以忽略onConnectedFailed()
的情况。
【讨论】:
你的回答是,是的,我知道我可以做到,但我希望有一种方法可以知道用户刚刚接受了谷歌播放服务中的游戏或重定向意图的方法我的其他活动的 Google Play 服务。【参考方案2】:到目前为止,我只能在 @Varren 的 Hack 上获得 1 分。当 Play Games Services 启动 MainActivity 时,我注意到了两件事。
getFlags() 始终为 0x14000000。 getPackage() 永远不会为 null,而当我们从应用菜单或调试模式启动应用时,它始终为 null。
所以使用这两个指针,我现在检查的是:
Intent i = getIntent();
int x = i.getFlags();
if(x==0x14000000)Log.d(TAG, "INTENT: flag matches Play!... " + x);
if(i.getPackage()!=null)Log.d(TAG, "INTENT: package matches Play!... " + getPackage());
//debug sheet values
//INTENT: flag matches Play!... 335544320
//INTENT: package matches Play!... com.example.MultiPlayerSample
归根结底,我仍然不是很自信,因为我知道这仍然是一个 hack。我只是希望 Google Game Play Services 可以解决此问题,并为我们提供灵活但可靠的解决方案。
【讨论】:
是的,我也没有找到合适的解决方案,但这个问题对大多数人来说似乎并不重要。 4 年后这个问题只有 700 次浏览)以上是关于如何从 Google Play 服务通知中检测意图的主要内容,如果未能解决你的问题,请参考以下文章
Google Play 服务:如何检查当前是不是有注册到位置更新/活动识别的“活动”挂起意图回调?
如何在 iOS 上禁用 Google Play 游戏服务中的推送通知权限?
Android 推送通知:Google Play 服务如何连接到 Google Server
如何在没有选择器意图的情况下直接打开 Google Play 商店应用程序 [重复]