发现Android没有活动来处理意图

时间:2014-08-14 04:09:43

标签: android android-activity android-studio foursquare

我将我的应用程序基于Foursquare oAuth sample

上发布的foursquare-oAuth-sample应用程序

对MyActivity进行的更改与示例代码非常相似,但仍然可以获得此更改,有人可以指出我需要更改的内容,代码如下所示

public class MyActivity extends FragmentActivity {


private static final int REQUEST_CODE_FSQ_CONNECT = 200;
private static final int REQUEST_CODE_FSQ_TOKEN_EXCHANGE = 201;

/**
 * Obtain your client id and secret from:
 * https://foursquare.com/developers/apps
 */
private static final String CLIENT_ID = "";
private static final String CLIENT_SECRET = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);
    ensureUi();
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.my, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

/**
 * Update the UI. If we already fetched a token, we'll just show a success
 * message.
 */
private void ensureUi() {
    boolean isAuthorized = !TextUtils.isEmpty(ExampleTokenStore.get().getToken());

    TextView tvMessage = (TextView) findViewById(R.id.tvMessage);
    tvMessage.setVisibility(isAuthorized ? View.VISIBLE : View.GONE);

    Button btnLogin = (Button) findViewById(R.id.btnLogin);
    btnLogin.setVisibility(isAuthorized ? View.GONE : View.VISIBLE);
    btnLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Start the native auth flow.
            Intent intent = FoursquareOAuth.getConnectIntent(MyActivity.this, CLIENT_ID);

            // If the device does not have the Foursquare app installed, we'd
            // get an intent back that would open the Play Store for download.
            // Otherwise we start the auth flow.
            if (FoursquareOAuth.isPlayStoreIntent(intent)) {
                toastMessage(MyActivity.this, getString(R.string.app_not_installed_message));
                startActivity(intent);
            } else {
                startActivityForResult(intent, REQUEST_CODE_FSQ_CONNECT);
            }
        }


    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case REQUEST_CODE_FSQ_CONNECT:
            onCompleteConnect(resultCode, data);
            break;

        case REQUEST_CODE_FSQ_TOKEN_EXCHANGE:
            onCompleteTokenExchange(resultCode, data);
            break;

        default:
            super.onActivityResult(requestCode, resultCode, data);
    }

}

private void onCompleteConnect(int resultCode, Intent data) {
    AuthCodeResponse codeResponse = FoursquareOAuth.getAuthCodeFromResult(resultCode, data);
    Exception exception = codeResponse.getException();

    if (exception == null) {
        // Success.
        String code = codeResponse.getCode();
        performTokenExchange(code);

    } else {
        if (exception instanceof FoursquareCancelException) {
            // Cancel.
            toastMessage(this, "Canceled");

        } else if (exception instanceof FoursquareDenyException) {
            // Deny.
            toastMessage(this, "Denied");

        } else if (exception instanceof FoursquareOAuthException) {
            // OAuth error.
            String errorMessage = exception.getMessage();
            String errorCode = ((FoursquareOAuthException) exception).getErrorCode();
            toastMessage(this, errorMessage + " [" + errorCode + "]");

        } else if (exception instanceof FoursquareUnsupportedVersionException) {
            // Unsupported Fourquare app version on the device.
            toastError(this, exception);

        } else if (exception instanceof FoursquareInvalidRequestException) {
            // Invalid request.
            toastError(this, exception);

        } else {
            // Error.
            toastError(this, exception);
        }
    }
}

private void onCompleteTokenExchange(int resultCode, Intent data) {
    AccessTokenResponse tokenResponse = FoursquareOAuth.getTokenFromResult(resultCode, data);
    Exception exception = tokenResponse.getException();

    if (exception == null) {
        String accessToken = tokenResponse.getAccessToken();
        // Success.
        toastMessage(this, "Access token: " + accessToken);

        // Persist the token for later use. In this example, we save
        // it to shared prefs.
        ExampleTokenStore.get().setToken(accessToken);

        // Refresh UI.
        ensureUi();

    } else {
        if (exception instanceof FoursquareOAuthException) {
            // OAuth error.
            String errorMessage = ((FoursquareOAuthException) exception).getMessage();
            String errorCode = ((FoursquareOAuthException) exception).getErrorCode();
            toastMessage(this, errorMessage + " [" + errorCode + "]");

        } else {
            // Other exception type.
            toastError(this, exception);
        }
    }
}

/**
 * Exchange a code for an OAuth Token. Note that we do not recommend you
 * do this in your app, rather do the exchange on your server. Added here
 * for demo purposes.
 *
 * @param code
 *          The auth code returned from the native auth flow.
 */
private void performTokenExchange(String code) {
    Intent intent = FoursquareOAuth.getTokenExchangeIntent(this, CLIENT_ID, CLIENT_SECRET, code);
    startActivityForResult(intent, REQUEST_CODE_FSQ_TOKEN_EXCHANGE);
}

public static void toastMessage(Context context, String message) {
    Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}

public static void toastError(Context context, Throwable t) {
    Toast.makeText(context, t.getMessage(), Toast.LENGTH_SHORT).show();
}

错误记录

这是我得到的例外,有人可以指出为什么它无法找到处理意图的活动?谢谢

08-13 23:15:23.137    2754-2754/com.example.panaceatechnologysolutions.farhansfoursquareapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.panaceatechnologysolutions.farhansfoursquareapp, PID: 2754
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=market://details?id=com.example.panaceatechnologysolutions.farhansfoursquareapp&referrer=utm_source=foursquare-android-oauth&utm_term=CLIENT_ID }
        at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1691)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1482)
        at android.app.Activity.startActivityForResult(Activity.java:3711)
        at android.app.Activity.startActivityForResult(Activity.java:3669)
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:840)
        at android.app.Activity.startActivity(Activity.java:3914)
        at android.app.Activity.startActivity(Activity.java:3882)
        at com.example.panaceatechnologysolutions.farhansfoursquareapp.MyActivity$1.onClick(MyActivity.java:90)
        at android.view.View.performClick(View.java:4598)
        at android.view.View$PerformClick.run(View.java:19268)
        at android.os.Handler.handleCallback(Handler.java:738)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5070)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:631)

08-13 23:15:30.157 2754-2765 / com.example.panaceatechnologysolutions.farhansfoursquareapp我/艺术:堆过渡到ProcessStateJankImperceptible花了7.253732ms保存至少72KB

好的,基于Rohans的回复,我检查过,因为我在模拟器上这样做,我在项目中的Foursquare oAuth库中的这个片段无法根据上下文和客户端ID创建意图。我不确定为什么它返回null并因此重定向到Google Play商店以在我的模拟器上安装foursquare。我已经使用foursquare注册了我的应用程序,并使用了已注册的客户端ID,此函数使用的其余参数是Foursquare oAuth Java类中的参数。如果有人与这个图书馆合作过,或者可以指出为什么它找不到意图请告诉我,因为我已经坚持了几天。

这是Rohan在MyActivity类中调用Foursquare oAuth Java类的代码行

    Intent intent = FoursquareOAuth.getConnectIntent(MyActivity.this, CLIENT_ID);

这是Foursquare oAuth Java Class中的getConnectIntent方法

    public static Intent getConnectIntent(Context context, String clientId) {
    Uri.Builder builder = new Uri.Builder();
    builder.scheme(URI_SCHEME);
    builder.authority(URI_AUTHORITY);
    builder.appendQueryParameter(PARAM_CLIENT_ID, clientId);
    builder.appendQueryParameter(PARAM_VERSION, String.valueOf(LIB_VERSION));
    builder.appendQueryParameter(PARAM_SIGNATURE, getSignatureFingerprint(context));

    Intent intent = new Intent(Intent.ACTION_VIEW, builder.build());
    if (isIntentAvailable(context, intent)) {
        return intent;
    }

    return getPlayStoreIntent(clientId);
}

2 个答案:

答案 0 :(得分:3)

它会重定向到Play商店,因为“isIntentAvailable为false”,它调用“getPlayStoreIntent”将您重定向到Play商店。 在isIntentAvailable方法中

private static boolean isIntentAvailable(Context context, Intent intent) {
     PackageManager packageManager = context.getPackageManager();
     List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(
    intent, PackageManager.MATCH_DEFAULT_ONLY);
    return resolveInfo.size() > 0;
 }

如果找到合适的包,则此方法返回true。 还检查您的客户端ID是否为空且是否正确

答案 1 :(得分:0)

是的Rohan ...你是对的它是假的,因为意图没有从isIntentAvailable返回任何东西,但真正的原因是因为我没有返回一个意图,因为因为我使用模拟器,包管理器显然看起来为安装的foursquare.apk包找不到它。我没有Foursquare在任何地方表明他们的apk必须安装,这不包括在他们在示例项目上面的链接中提供的oAuth库的一部分。我猜他们假设你使用Android设备进行测试,而不是模拟器。以下是在Android工作室或Eclipse im猜测中使用Android模拟器上的Foursquare的oAuth的步骤。

1)下载Foursquare APK http://www.apk4fun.com/apk/6395/

2)作为Android工作室中必备的开放式Android SDK管理器并确保下载和安装Google API,Foursquare需要这些;

3)将foursquare.apk文件复制到/ Applications / sdk / platform-tools文件夹中

4)使用adb工具在文件夹中安装apk,如此链接所示How to install an apk on the emulator in Android Studio?

5)现在您的应用可以使用模拟器联系foursquare,您将不会被重定向到模拟器上安装应用程序!

- 注意,我注意到我必须重新安装&#34; foursquare.apk&#34;当我第二天关闭Android工作室和模拟器时。但很容易,因为我知道该怎么做,希望这能让其他人感到沮丧,因为我花了几天的时间来弄清楚这一点:)