我可以使用v2 Dropbox API登录并从我的Android应用程序导出/导入。唯一的问题是首次运行时请求令牌并启动Dropbox应用程序/网站 - 我必须至少运行两次Auth.startOAuth2Authentication并暂停,以便能够使用Auth.getOAuth2Token读取令牌。
是否有wait()并在获取令牌后startOAuth2Authentication返回时收到通知?
Auth.startOAuth2Authentication(this, getString(R.string.app_key));
//wait for response, retry, or time out and finish
String accessToken = Auth.getOAuth2Token();
prefs.edit().putString(ACCESS_TOKEN, accessToken).commit();
答案 0 :(得分:1)
您不应该拨打getOAuth2Token
两次,并且在致电startOAuth2Authentication
后不应立即致电startOAuth2Authentication
。
您应该通过调用getOAuth2Token
来启动流程,如下例所示:
然后您应该稍后在onResume
中调用 <xsl:function name="functx:camel-case-to-words" as="xs:string"
xmlns:functx="http://www.functx.com">
<xsl:param name="arg" as="xs:string?"/>
<xsl:param name="delim" as="xs:string"/>
<xsl:sequence select="
concat(substring($arg,1,1),
replace(substring($arg,2),'(\p{Lu})',
concat($delim, '$1')))
"/>
</xsl:function>
来完成该流程,如下例所示:
答案 1 :(得分:0)
以下是实施Dropbox Android API的简单示例: https://www.sitepoint.com/adding-the-dropbox-api-to-an-android-app/
现在,为了解决您的问题,在调用Auth.startOAuth2Authentication(this, getString(R.string.app_key));
后,您将无法立即获得警告。调用此方法后,将显示Dropbox登录活动,并且只有在用户登录后才能获取令牌(这绝不是直接的,您无法知道需要多长时间)。
用户成功登录后,您的活动将恢复,您可以在教程的示例中看到活动的onResume
方法被覆盖,在那里执行检查。
我将在本教程的LoginActivity
下面复制。从这里开始应该很容易:
public class LoginActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Button SignInButton = (Button) findViewById(R.id.sign_in_button);
SignInButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Auth.startOAuth2Authentication(getApplicationContext(), getString(R.string.APP_KEY));
}
});
}
@Override
protected void onResume() {
super.onResume();
getAccessToken();
}
public void getAccessToken() {
String accessToken = Auth.getOAuth2Token(); //generate Access Token
if (accessToken != null) {
//Store accessToken in SharedPreferences
SharedPreferences prefs = getSharedPreferences("com.example.valdio.dropboxintegration", Context.MODE_PRIVATE);
prefs.edit().putString("access-token", accessToken).apply();
//Proceed to MainActivity
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
}
}
}