2017-01-20 18 views
0

我有點迷失了這個功能。如何啓動一個URL並獲得回撥到Android中的活動

我必須創建一個令牌請求。然後,當我有這個令牌時,我必須用這個臨時令牌啓動一個URL,以允許用戶使用他的賬戶登錄並允許應用使用他的賬戶。但這是我遇到的問題。我不清楚如何才能實現這一點。

(我使用TMBD API) enter image description here

例如,第一步(我做室內用它Retrofit2)

@GET("authentication/token/new") 
Observable<TokenResponseTMDB> getNewTemporaryToken(@Query("api_key") String apikey); 

@Override 
    public void getTemporaryToken() { 
     Observable<TokenResponseTMDB> tokenResponseTMDBObservable = serviceTMDB.getNewTemporaryToken(API_KEY); 
     tokenResponseTMDBObservable.subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<TokenResponseTMDB>() { 
        @Override 
        public void onCompleted() { 
         Logger.d(temporaryToken); 
        } 

        @Override 
        public void onError(Throwable e) { 
         Logger.e(e.getMessage()); 
        } 

        @Override 
        public void onNext(TokenResponseTMDB tokenResponseTMDB) { 
         temporaryToken = tokenResponseTMDB.getRequestToken(); 
        } 
       }); 
    } 

但現在,我不知道該怎麼做一步我的意思是,我可以調用的URL,像這樣的標記:

String url = "https://www.themoviedb.org/authenticate/"+token; 
Intent i = new Intent(Intent.ACTION_VIEW); 
i.setData(Uri.parse(url)); 
startActivity(i); 

但我不知道,如果CA與改造完成了,我怎麼能處理身份驗證頭呃在指南中說過

如果它們未被重定向到自定義URL,那麼該頁面也將具有 Authentication-Callback標頭。此標題包含步驟#3的 的API調用。你可以手動生成它,或者簡單地使用我們返回的那一個。

回答

0

我最近也遇到過這個問題。這是我解決它的方式。

  1. 第一步很容易,你幾乎已經做到了。首先,你必須調用請求令牌,一旦你得到它,啓動一個WebView。我爲這一步使用了一個新的Activity,但是你可以留在同一個Activity/Fragment中。

    Call<Token> call = mTmdbInterface.getToken(BuildConfig.TMDB_APIKEY); 
    call.enqueue(new Callback<Token>() { 
    
        @Override 
        public void onResponse(Call<Token> call, Response<Token> response) { 
    
         Intent intent = new Intent(getActivity(), WebViewActivity.class); 
         intent.putExtra("token",response.body().getRequestToken()); 
         startActivityForResult(intent, 11); 
        } 
    
        public void onFailure(Call<Token> call, Throwable t) { 
    
        } 
    }); 
    
  2. 你應該用以下鏈接啓動網頁視圖: 「https://www.themoviedb.org/authenticate/」 +令牌。這一步的其餘部分是你應該擔心的應用程序開發者,你應該等待登錄部分完成,然後等待默認包含「/ allow」的重定向鏈接。 因此,您使用它來通知您的應用程序,用戶登錄部分已完成並完成WebView和WebActivity,因此您可以轉到您的活動/片段開始。

    public class WebViewActivity extends Activity { 
    
        String token; 
        WebView webView; 
    
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
    
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_web_view); 
    
         token = getIntent().getExtras().getString("token"); 
    
         webView = (WebView) findViewById(R.id.webview); 
         webView.loadUrl("https://www.themoviedb.org/authenticate/" + token); 
         webView.getSettings().setJavaScriptEnabled(true); 
         webView.setWebViewClient(new WebViewClient() { 
    
          @Override 
          public boolean shouldOverrideUrlLoading(WebView view, String url) { 
           view.loadUrl(url); 
           return false; 
          } 
    
          @Override 
          public void onPageFinished(WebView view, String url) { 
           super.onPageFinished(view, url); 
    
           if (url.contains("/allow")){ 
            new Handler().postDelayed(new Runnable() { 
            @Override 
            public void run() { 
             Intent intent = new Intent(); 
             intent.putExtra("token", token); 
             setResult(11, intent); 
             finish(); 
             } 
            }, 1000); 
    
           } 
          } 
         }); 
        } 
    } 
    
  3. 在這一步驟中,你的出發活動/片段您使用身份驗證令牌獲取會話ID。那就是它。

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    
        if(requestCode == 11) { 
    
         Call<Session> call = mTmdbInterface.getSessionId(BuildConfig.TMDB_APIKEY, data.getExtras().getString("token")); 
         call.enqueue(new Callback<Session>() { 
    
          @Override 
          public void onResponse(Call<Session> call, Response<Session> response{ 
           displayProfile(response.body().getSessionId()); 
          }  
    
          @Override 
          public void onFailure(Call<Session> call, Throwable t) { 
    
          } 
         }); 
        } 
    } 
    

我希望它可以幫助別人,如果別人你已經做到了。 我不知道這是否是最佳做法,但這是我做到的方式,對我來說工作得很好。

相關問題