2017-01-20 13 views
0

Я немного потерял эту функцию.Как запустить URL-адрес и получить обратный вызов для активности в Android

Мне нужно создать запрос на токен. Затем, когда у меня есть этот токен, я должен запустить URL-адрес с этим временным токеном, чтобы позволить пользователю войти в свою учетную запись и разрешить приложению использовать свою учетную запись. Но вот в чем проблема. Я не понимаю, как это можно добиться.

(я использую TMBD API) enter image description here

Например, первый шаг (я сделал это Wiht 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(); 
        } 
       }); 
    } 

Но теперь, я не знаю, как сделать шаг 2. Я имею в виду, я могу назвать URL с маркером, как это:

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

Но я не уверен, если ча быть сделано с дооснащения, и как я могу справиться с головой Authentication ээ, что сказано в руководстве

Если они не перенаправляется на пользовательский URL, страница будет также иметь заголовок Authentication-Callback с . Этот заголовок содержит вызов API для шаг №3. Вы можете либо вручную создать его, либо просто использовать тот, который мы возвращаем .

ответ

0

Я недавно столкнулся с этой проблемой. Вот как я это решил.

  1. Первый шаг легко, и вы почти это уже сделали. Сначала вам нужно сделать звонок для токена запроса, и как только вы его получите, запустите WebView. Я использовал новую активность для этого шага, но вы можете оставаться в одной и той же Деятельности/Фрагменте.

    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. Вы должны запустить Webview со следующей ссылкой: "https://www.themoviedb.org/authenticate/" + маркер. Остальная часть этого шага - это не то, о чем вам следует беспокоиться, как разработчик приложений, вы должны просто дождаться завершения процесса входа в систему и дождаться ссылки перенаправления, которая по умолчанию содержит: «/ allow». Итак, вы используете это, чтобы уведомить свое приложение о том, что пользовательская часть входа завершена, и завершите работу WebView и WebActivity, чтобы вы могли перейти в свою Activity/Fragment, где все началось.

    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. На этом этапе, в стартовой деятельности/Fragment вы используете аутентификацию маркер, чтобы получить идентификатор сессии. Вот и все.

    @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) { 
    
          } 
         }); 
        } 
    } 
    

Я надеюсь, что это помогает кому-то еще, если вы уже сделали это. Я не знаю, является ли это лучшей практикой, но так я и сделал, и это отлично работает для меня.