我正在尝试在 Android 应用程序中使用 OAuth。我让它正常工作,但有时在身份验证阶段遇到问题。在 Android 中,我启动浏览器供用户登录和验证。然后回调 url 将重定向回我的应用程序。
问题来了。我的应用程序有一个 OAuth 消费者和提供者作为我的主类的成员。当启动浏览器进行身份验证时,有时我的主要 Activity 会被丢弃以节省内存。当回调 url 重新启动我的主要 Activity 时,提供者和消费者是新实例,因此当我尝试向 api 发出请求时不起作用。如果在身份验证阶段未释放主 Activiy,则一切正常,因为我仍在与原始消费者和提供者合作。
我尝试使用 onSaveInstanceState() 和 onRestoreInstanceState(),但没有成功。处理我的回调 URL 时,似乎没有调用 onRestoreInstanceState()。似乎直接进入 onResume()。
在这种情况下,持久化消费者和提供者的正确方法是什么?
最佳答案
完整的保存/恢复解决方案
除了 request_token
和 token_secret
之外,isOauth10a()
状态对于在提供程序中恢复很重要。将来可能会有更多的状态信息。因此,我最喜欢持久化和加载解决方案。
我扩展了 GrkEngineer 的解决方案以使其更加完整。它保存/恢复提供者和消费者,处理所有异常,并在恢复时设置 httpClient。
protected void loadProviderConsumer()
{
try {
FileInputStream fin = this.openFileInput("tmp_provider.dat");
ObjectInputStream ois = new ObjectInputStream(fin);
provider = (CommonsHttpOAuthProvider) ois.readObject();
provider.setHttpClient(httpClient);
ois.close();
fin.close();
fin = this.openFileInput("tmp_consumer.dat");
ois = new ObjectInputStream(fin);
consumer = (CommonsHttpOAuthConsumer) ois.readObject();
ois.close();
fin.close();
Log.d("OAuthTwitter", "Loaded state");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (StreamCorruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
protected void persistProviderConsumer()
{
try {
FileOutputStream fout = this.openFileOutput("tmp_provider.dat", MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(provider);
oos.close();
fout.close();
fout = this.openFileOutput("tmp_consumer.dat", MODE_PRIVATE);
oos = new ObjectOutputStream(fout);
oos.writeObject(consumer);
oos.close();
fout.close();
Log.d("OAuthTwitter", "Saved state");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
我已经测试了这段代码并且它有效。
关于android - Android 中的 OAuth 实例状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1965568/