Android Instagram 登录集成

问题描述 投票:0回答:1

我正在尝试在没有 Graph API 的情况下通过 Instagram 执行社交登录,并从 Instagram 文档和 StackOverflow 中阅读与其相关的所有必要内容。

以下是我到目前为止在项目中所做的事情:

  1. 通过我的用户名密码登录Instagram开发者帐户。

  2. 管理客户端 > 注册新客户端并在我的常量文件中添加生成的客户端 ID、密钥和重定向 URL。

  3. 对于网络视图,我的完整网址是:https://api.instagram.com/oauth/authorize/?client_id=af7efcca661e43459b1e502af7ddb689&redirect_url=https://instagram.com/&response_type=token&scope=basic+public_content

  4. 当我在 WebView 中输入用户名和密码而不是在重定向 URL 上导航时,它会在 WebView 上不断显示错误:

    {"error_type": "OAuthException", "code": 400, "error_message": "You must include a valid client_id, response_type, and redirect_uri parameters"}

  5. 我想收到

    access_token
    ,但它显示我的错误。

下面是我需要的代码:

MainActivity.java

public class MainActivity extends AppCompatActivity implements AuthenticationListener {

    private AuthenticationDialog authDialog;
    private Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        context = this;
    }

    @Override
    public void onCodeReceived(String token) {
        if (token == null)
            return;
    }

    @OnClick(R.id.buttonLogin)
    public void loginClick() {
        authDialog = new AuthenticationDialog(this, this);
        authDialog.setCancelable(true);
        authDialog.getWindow().setLayout(((getWidth(context) / 100) * 90), LinearLayout.LayoutParams.MATCH_PARENT);
        authDialog.getWindow().setGravity(Gravity.CENTER);
        authDialog.show();
    }

    public static int getWidth(Context context) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        WindowManager windowmanager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        windowmanager.getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics.widthPixels;
    }
}

AuthenticationDialog.java

public class AuthenticationDialog extends Dialog {
    private String TAG = AuthenticationDialog.class.getSimpleName();
    private AuthenticationListener listener;
    private Context context;
    private WebView webView;

    private final String url = Constants.BASE_URL + "oauth/authorize/?client_id=" +
            Constants.INSTAGRAM_CLIENT_ID
            + "&redirect_url="
            + Constants.REDIRECT_URL
            + "&response_type=token"
            + "&scope=basic+public_content";

    public AuthenticationDialog(@NonNull Context context, AuthenticationListener listener) {
        super(context);

        this.context = context;
        this.listener = listener;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.auth_dialog);
        initializeWebView();
    }

    private void initializeWebView() {
        webView = (WebView) findViewById(R.id.webView);
        webView.getSettings().setUseWideViewPort(true);
        webView.getSettings().setLoadWithOverviewMode(true);

        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl(url);
        Log.d(TAG, "url: " + url);
        //webView.loadUrl("http://api.instagram.com/");
        //webView.loadUrl("https://api.instagram.com/oauth/authorize/?client_id=af7efcca661e43459b1e502af7ddb689&redirect_uri=https://instagram.com/&response_type=token&scope=basic+public_content");
        webView.setWebViewClient(new WebViewClient() {

            String access_token;
            boolean authComplete;

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                Log.d(TAG, "onPageStarted called");
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                Log.d(TAG, "onPageFinished called");
                if (url.contains("#access_token=") && !authComplete) {
                    Log.d(TAG, " inside access_token");
                    Uri uri = Uri.parse(url);
                    access_token = uri.getEncodedFragment();
                    //get the whole token after "=" sign
                    access_token = access_token.substring(access_token.lastIndexOf("=") + 1);
                    Log.d(TAG, "token: " + access_token);
                    authComplete = true;
                    listener.onCodeReceived(access_token);
                    dismiss();
                } else if (url.contains("?error")) {
                    Log.d(TAG, "getting error fetching access token");
                    dismiss();
                } else {
                    Log.d(TAG, "outside both" + url.toString());
                }
            }
        });
    }
}

根据日志,代码最后出现在“两者之外”,而且 WebView 也显示了我在第 1 点中提到的错误。 4.

有人可以帮忙吗?

android instagram instagram-api
1个回答
0
投票

嗯,您可以简单地在 Web 浏览器上使用 URL 进行测试,以检查 URL 是否有效。我想这不是java代码问题,而是你在管理客户端

中的设置问题

确保

client_id
是否正确且
redirect_url
是否与 Instagram 开发者网站上的设置相同。

© www.soinside.com 2019 - 2024. All rights reserved.