Android Dropbox API无法保存登录信息

Android Dropbox API无法保存登录信息,第1张

概述我是Android编程的初学者.我一直在努力让Dropbox融入我正在编写的应用程序的[开头].我按照说明查看了DropboxAPI附带的基本示例DBRoulette.我一直遇到的问题是我登录Dropbox(通过网络浏览器),然后确认该应用程序可以使用其DropboxApp文件夹……对于该会话,它工作正常,但是当我完

我是Android编程的初学者.我一直在努力让DropBox融入我正在编写的应用程序的[开头].我按照说明查看了DropBox API附带的基本示例Dbroulette.

我一直遇到的问题是我登录DropBox(通过网络浏览器),然后确认该应用程序可以使用其DropBox App文件夹……对于该会话,它工作正常,但是当我完全关闭应用程序并打开它再次,我被要求再次登录!我绝对不希望再次重新输入我的所有DropBox登录内容,即使这仅仅是出于调试目的.
有趣的是Dbroulette工作正常,我不必每次都登录!我复制粘贴了该示例中的大部分功能代码.

我们在谈论它时,Accesstokens究竟包含/做什么?他们是否存储信息以创建授权会话?这些信息是否与我从DropBox开发者网站获得的App key / secret组合不同?我认为这是我的错误,但我不确定.

这是活动:

package com.Js.music;import androID.app.Activity;import androID.content.Intent;import androID.content.SharedPreferences;import androID.content.SharedPreferences.Editor;import androID.os.Bundle;import androID.util.Log;import androID.vIEw.Menu;import androID.vIEw.VIEw;import androID.Widget.button;import androID.Widget.Toast;import com.dropBox.clIEnt2.DropBoxAPI;import com.dropBox.clIEnt2.androID.AndroIDAuthSession;import com.dropBox.clIEnt2.session.AccesstokenPair;import com.dropBox.clIEnt2.session.AppKeyPair;import com.dropBox.clIEnt2.session.TokenPair;import com.dropBox.clIEnt2.session.Session.Accesstype;public class MainActivity extends Activity {private static String TAG = "MainActivity";private button gotoRecordingbutton;private button librarybutton;//DropBoxfinal static private String APP_KEY = "xxxxxxxxxxxxx";final static private String APP_SECRET = "xxxxxxxxxxxxxx"; final static private Accesstype ACCESS_TYPE = Accesstype.APP_FolDER; private DropBoxAPI<AndroIDAuthSession> mDBAPI; final static public String ACCOUNT_PREFS_name = "MusicDBPrefs";final static public String ACCESS_KEY_name = "Music_DB_ACCESS_KEY";final static public String ACCESS_SECRET_name = "Music_DB_ACCESS_SECRET";private boolean mIsLoggedIn = false;@OverrIDeprotected voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentVIEw(R.layout.activity_main);    gotoRecordingbutton = (button) findVIEwByID(R.ID.goto_recording_button);    gotoRecordingbutton.setonClickListener(new VIEw.OnClickListener() {        @OverrIDe        public voID onClick(VIEw v) {            Intent intent = new Intent(MainActivity.this, RecordActivity.class);            startActivity(intent);        }    });    librarybutton = (button) findVIEwByID(R.ID.library_button);    librarybutton.setonClickListener(new VIEw.OnClickListener() {        @OverrIDe        public voID onClick(VIEw v) {            // Todo auto-generated method stub        }    });    AndroIDAuthSession session = buildSession();    mDBAPI = new DropBoxAPI<AndroIDAuthSession>(session);    mDBAPI.getSession().startAuthentication(MainActivity.this);    setLoggedIn(mDBAPI.getSession().islinked());    Toast msg = Toast.makeText(this, "logged in: " + isLoggedIn(), Toast.LENGTH_LONG);    msg.show();}@OverrIDepublic boolean onCreateOptionsMenu(Menu menu) {    // Inflate the menu; this adds items to the action bar if it is present.    getMenuInflater().inflate(R.menu.main, menu);    return true;}//-------------DropBox stuff  for testing and deBUGging---------@OverrIDeprotected voID onResume() {    super.onResume();    AndroIDAuthSession session = mDBAPI.getSession();    // The next part must be inserted in the onResume() method of the    // activity from which session.startAuthentication() was called, so    // that DropBox authentication completes properly.    if (session.authenticationSuccessful()) {        try {            // Mandatory call to complete the auth            session.finishAuthentication();            // Store it locally in our app for later use            TokenPair tokens = session.getAccesstokenPair();            storeKeys(tokens.key, tokens.secret);            setLoggedIn(true);        } catch (IllegalStateException e) {            Log.i(TAG, "Error authenticating", e);        }    }}//copIEd from dropBox APIprivate voID storeKeys(String key, String secret) {    // Save the access key for later    SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_name, 0);    Editor edit = prefs.edit();    edit.putString(ACCESS_KEY_name, key);    edit.putString(ACCESS_SECRET_name, secret);    edit.commit();}private String[] getKeys() {    SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_name, 0);    String key = prefs.getString(ACCESS_KEY_name, null);    String secret = prefs.getString(ACCESS_SECRET_name, null);    if (key != null && secret != null) {        Log.i(TAG,"Got keys");        String[] ret = new String[2];        ret[0] = key;        ret[1] = secret;        return ret;    } else {        return null;    }}private AndroIDAuthSession buildSession() {    AppKeyPair appKeyPair = new AppKeyPair(APP_KEY, APP_SECRET);    AndroIDAuthSession session;    String[] stored = getKeys();    if (stored != null) {        AccesstokenPair accesstoken = new AccesstokenPair(stored[0], stored[1]);        session = new AndroIDAuthSession(appKeyPair, ACCESS_TYPE, accesstoken);    } else {        session = new AndroIDAuthSession(appKeyPair, ACCESS_TYPE);    }    return session;}public voID setLoggedIn(boolean loggedIn) {    mIsLoggedIn = loggedIn;}public boolean isLoggedIn() {    return mIsLoggedIn;}}

任何帮助赞赏!

解决方法:

使用DropBoxAPI时的主要想法是:在第一次连接时,您必须获取密钥,下次必须使用这些密钥才能访问而无需通过浏览器确认.

即在onResume方法中你应该使用这一行

AccesstokenPair tokens = mDBAPI.getSession().getAccesstokenPair();

其中DropBoxAPI mDBAPI;

然后你需要保存数据

AccesstokenPair tokens 

在sqlite或SharedPrefs中.

那你应该使用这样的方法:

private DropBoxAPI <AndroIDAuthSession> getDropBoxAPI(){    AppKeyPair appKeys = new AppKeyPair(APP_KEY, APP_SECRET);    AndroIDAuthSession session = new AndroIDAuthSession(appKeys, ACCESS_TYPE);    mDBAPI = new DropBoxAPI<AndroIDAuthSession>(session);    AccessKeys keys = dm.getAccessKeys(APP_KEY); //dm is DatabaseManager of Ormlite    if (keys == null) return null;    AccesstokenPair access = new AccesstokenPair(keys.getAccessKey(), keys.getAccessSecret());    mDBAPI.getSession().setAccesstokenPair(access);    return mDBAPI;}

AccessKeys是我通过Ormlite存储密钥的类:

@Databasetablepublic class AccessKeys {...     @DatabaseFIEld private String accessKey;    @DatabaseFIEld private String accessSecret;    @DatabaseFIEld private String appKey;    @DatabaseFIEld private String appSecret;...}

最后一件事:当你拿到所有钥匙时,你不应该跑

mDBAPI.getSession().startAuthentication(MainActivity.this);

只需使用mDBAPI作为目标,例如“mDBAPI.putfile(some data)”

Note: You only need to do startAuthentication() once, You don’t need to run it to authorize the key pair from the actual login.

总结

以上是内存溢出为你收集整理的Android Dropbox API无法保存登录信息全部内容,希望文章能够帮你解决Android Dropbox API无法保存登录信息所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1115601.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存