我是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无法保存登录信息所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)