【问题标题】:Android intent redirect from user shows no UI来自用户的 Android 意图重定向显示没有 UI
【发布时间】:2015-11-19 07:45:47
【问题描述】:

我正在我的移动应用上运行某种 OAuth 挑战,流程是这样的:

  1. 用户输入电子邮件地址并点击“登录”。
  2. 转到浏览器 -> 按下按钮,此操作会将他重定向回登录活动页面。

更新后(在编辑 2 中),流程来自 SignInActivity -> Browser -> SignInactivity(以上更新)。

这是当前的流程。在SignInActivity中,我使用下面的intent-filter

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="com.alpha.beta" android:host="signin" />
</intent-filter>

问题在于,当单击按钮并且焦点返回到应用程序时,SignIn 视图不显示任何 UI。


编辑 1

PS:因为我使用的是 Xamarin,所以代码在 c# 中。

我被要求发布一些代码,但这有点难。这是我所拥有的:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.AlphaBeta.AlphaBeta" android:versionName="1.1.1" android:versionCode="7">
    <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="19" />
    <application android:name="AlphaBeta.Application" android:label="AlphaBeta" android:icon="@drawable/icon" android:debuggable="true">
        <activity android:label="@string/appName" android:name="AlphaBeta.SignInActivity" android:screenOrientation="portrait" android:configChanges="orientation" android:noHistory="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.CREATE_SHORTCUT" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="http" />
                <data android:host="*" />
                <data android:pathPattern=".*\\.AlphaBeta" />
                <data android:pathPattern=".*\\..*\\.AlphaBeta" />
                <data android:pathPattern=".*\\..*\\..*\\.AlphaBeta" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\.AlphaBeta" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.AlphaBeta" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.AlphaBeta" />
                <data android:mimeType="*/*" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="https" />
                <data android:host="*" />
                <data android:pathPattern=".*\\.AlphaBeta" />
                <data android:pathPattern=".*\\..*\\.AlphaBeta" />
                <data android:pathPattern=".*\\..*\\..*\\.AlphaBeta" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\.AlphaBeta" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.AlphaBeta" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.AlphaBeta" />
                <data android:mimeType="*/*" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="file" />
                <data android:host="*" />
                <data android:pathPattern=".*\\.AlphaBeta" />
                <data android:pathPattern=".*\\..*\\.AlphaBeta" />
                <data android:pathPattern=".*\\..*\\..*\\.AlphaBeta" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\.AlphaBeta" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.AlphaBeta" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.AlphaBeta" />
                <data android:mimeType="*/*" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="content" />
                <data android:mimeType="application/octet-stream" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="com.AlphaBeta.AlphaBeta" android:host="sso" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
</manifest>

SignInActivity.cs

public class SignInActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
    }

    protected override void OnResume()
    {
        base.OnResume();

        Android.Net.Uri redirectUriFromBrowser = this.Intent.Data;
        if (redirectUriFromBrowser != null)
        {
            // Redirect from user to continue with the SignIn flow
            string SignInToken = SignInTokenFromUri(redirectUriFromBrowser);
            if (singleSignOnToken == null)
            {
                HandleSignInFailure(this);
            }
            else
            {
                HandleSignInSuccess(this);
            }
        }
        else ...
    }

    ...
}

编辑 2:

我只是想知道 android 意图过滤器在当前用例中是否不正确。请注意流量来自SignInActivity -> Browser -> SignInactivity(以上更新)。


编辑 3:

浏览器调用:

Uri loginUri = Uri.Parse(user.SignInLink);
Intent SignInIntent = new Intent(Intent.ActionView, loginUri);
this.StartActivity(SignInIntent);

【问题讨论】:

  • 没有活动代码就无法回答这个问题。同时发布一些清单代码。
  • 你能发布你的代码吗?你也调用了finish();方法?
  • @EmanuelMoecklin 请看看这是否满足用例。
  • @ivan 请查看更新。谢谢。
  • 启动浏览器部分的代码在哪里?当用户返回应用程序时,它是否真正启动并显示 Activity 或根本不显示?

标签: android android-intent


【解决方案1】:

您可能从 cmets 中注意到,我将 UI 设置在 if-else 块之一中,但没有调用它们。当您编写错误的代码或盯着屏幕超过不寻常的时间时,通常会发生这种情况。可能会晚一点。

【讨论】:

    猜你喜欢
    • 2019-01-02
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多