Android Dev - URL обратного вызова не работает... (0_o)
Я работаю над приложением Android для своего исследования и работаю с OAuth (библиотекой указателей), чтобы получить доступ к пользовательским данным из веб-сервиса, который также является частью процесса разработки. Я могу пройти через общие этапы OAuth и использую Uri (для обратного вызова приложения), и могу перейти к этапу, на котором я вызываю браузер устройств, выбираю для проверки свое приложение, и следующий шаг ПРЕДПОЛАГАЕТСЯ перенаправить браузер НАЗАД в приложение....
Вместо этого я получаю сообщение об ошибке вроде "у вас нет разрешения на открытие:
appSchema: // appName? authorizationSensitiveInfo... "приложения после '?' являются oauth_token и oauth_verifier из сервиса (мы можем предположить, что все шаги до тех пор, пока перенаправление не будет "правильным").
Возможные проблемы лежат в пределах appSchema://appName
часть. Насколько я понимаю, это URL-адрес перенаправления, который говорит Uri использовать браузер телефона, чтобы найти мое приложение и вызвать метод onResume(). Где сделать значения для appSchema://appName
приходят (определено в манифесте? если да, то где?).
Почему проблема с разрешением? Должен ли я установить разрешения для моего Uri для доступа к моему приложению? Я заблудился... если вам нужны фрагменты кода, чтобы помочь мне, пожалуйста, ответьте, я не включил никакого кода, потому что это больше похоже на концепцию, которую я только что пропустил... Я сейчас не на своей машине, но могу предоставить код, если это сделает вещи проще для понимания. Действительно бить мою голову здесь...
В ОТВЕТ НА БОЛЬШОЙ ОТВЕТ ЗДЕСЬ, КАК Я ОБРАЩАЮСЬ НА РЕЗЮМЕ
protected void onResume() {
super.onResume();
Uri uri = this.getIntent().getData();
if (uri != null && uri.toString().startsWith(CALLBACK_URL)) {
Log.d("StepGreenM", uri.toString());
String verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
Log.d("StepGreenM", verifier);
try {
provider.retrieveAccessToken(consumer, verifier);
TOKEN = consumer.getToken();
REQUEST_SECRET = consumer.getTokenSecret();
Log.d("StepGreenM", TOKEN);
Log.d("StepGreenM", REQUEST_SECRET);
} catch (OAuthMessageSignerException e) {
e.printStackTrace();
} catch (OAuthNotAuthorizedException e) {
e.printStackTrace();
} catch (OAuthExpectationFailedException e) {
e.printStackTrace();
} catch (OAuthCommunicationException e) {
e.printStackTrace();
}
}
uri = getIntent().getData();
if (uri != null && CALLBACK_URI.getScheme().equals(uri.getScheme())) {
String token = settings.getString(HomeScreen.REQUEST_TOKEN, null);
String secret = settings.getString(HomeScreen.REQUEST_SECRET, null);
Intent i = new Intent(Intent.ACTION_VIEW); // Intent to go to the action view
try {
if(!(token == null || secret == null)) {
consumer.setTokenWithSecret(token, secret);
}
String otoken = uri.getQueryParameter(OAuth.OAUTH_TOKEN);
String verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
// We send out and save the request token, but the secret is not the same as the verifier
// Apparently, the verifier is decoded to get the secret, which is then compared - crafty
// This is a sanity check which should never fail - hence the assertion
Assert.assertEquals(otoken, consumer.getToken());
// This is the moment of truth - we could throw here
provider.retrieveAccessToken(consumer, verifier);
// Now we can retrieve the goodies
token = consumer.getToken();
secret = consumer.getTokenSecret();
//Save it to a settings file
HomeScreen.saveAuthInformation(settings, token, secret);
// Clear the request stuff, now that we have the real thing
HomeScreen.saveRequestInformation(settings, null, null);
i.putExtra(USER_TOKEN, token);
i.putExtra(CONSUMER_SECRET, secret);
//GO TO APPLICATION
} catch (OAuthMessageSignerException e) {
e.printStackTrace();
} catch (OAuthNotAuthorizedException e) {
e.printStackTrace();
} catch (OAuthExpectationFailedException e) {
e.printStackTrace();
} catch (OAuthCommunicationException e) {
e.printStackTrace();
} finally {
startActivity(i); // we either authenticated and have the extras or not, but are going to the action view
this.setContentView(R.layout.indivaction);
finish();
}
}
}
Не уверен, что на самом деле делает это разваливается... но, как я уже сказал, сила закрывается, когда этот метод вызывается. Я знаю, что он проходит через перенаправление, потому что я использую httpSniffer для проверки сообщений на сервер и с сервера...
1 ответ
Для правильной работы обратного вызова URI необходимо добавить фильтр намерений, подобный следующему, к своему манифесту в действии, в котором вы хотите его использовать.
<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="appSchema" android:host="appName"/>
</intent-filter>
Теперь, если ваша деятельность использует singleInstance/singleTask, вы должны использовать что-то похожее на следующее:
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Uri uri = intent.getData();
String oauthToken = uri.getQueryParameter("oauth_token");
String oauthVerifier = uri.getQueryParameter("oauth_verifier");
//...do what you need with the parameters
}
если вы не используете singleTask или singleInstance, вы можете сделать
@Override
public void onResume() {
super.onResume();
Intent intent = getIntent();
Uri uri = intent.getData();
String oauthToken = uri.getQueryParameter("oauth_token");
String oauthVerifier = uri.getQueryParameter("oauth_verifier");
//...do what you need with the parameters
}
Я считаю, что это должно работать.
Кроме того, если я не ошибаюсь, URL-адрес обратного вызова, который вы предоставляете, должен включать?, Так что "appSchema://appName?"