Android Dropbox Api AccessToken已更改
我正在开发一个android应用程序,它有可能提供大量的统计信息。我想把这些数据保存在我的dropbox上,以便以后分析 因此,我使用AuthActivity获取我自己帐户的密钥和机密,然后对其进行硬编码以获取AcessTokenPair实例:Android Dropbox Api AccessToken已更改,android,authentication,file-upload,dropbox-api,Android,Authentication,File Upload,Dropbox Api,我正在开发一个android应用程序,它有可能提供大量的统计信息。我想把这些数据保存在我的dropbox上,以便以后分析 因此,我使用AuthActivity获取我自己帐户的密钥和机密,然后对其进行硬编码以获取AcessTokenPair实例: AcessTokenPair tokenPair = new AccessTokenPair("key", "secret"); mDBApi.getSession().setAccessTokenPair(tokenPair); 然后
AcessTokenPair tokenPair = new AccessTokenPair("key", "secret");
mDBApi.getSession().setAccessTokenPair(tokenPair);
然后,我使用下面的异步任务将文件发送到我的dropbox:
private class SendToDropbox extends AsyncTask<String, Void, String> {
@SuppressWarnings("deprecation")
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
String timestamp = new Date().toString();
FileInputStream inputStream = null;
DisplayMetrics dm = new DisplayMetrics();
win.getDefaultDisplay().getMetrics(dm);
double x = Math.pow(dm.widthPixels / dm.xdpi, 2);
double y = Math.pow(dm.heightPixels / dm.ydpi, 2);
double screenInches = Math.sqrt(x + y);
File sdcard = new File(Environment.getExternalStorageDirectory()
.getPath());
File session = null;
try {
session = File.createTempFile("analytics_" + timestamp, ".txt", sdcard);
if (session.exists()) {
PrintStream ps = new PrintStream(session);
ps.println("Screen Size: " + screenInches);
ps.println("Device: " + android.os.Build.MODEL);
ps.println("Carrier: " + android.os.Build.BRAND);
ps.println("Locale: " + Locale.getDefault().toString());
ps.println("OS: " + android.os.Build.VERSION.SDK);
ps.println("${EOF}");
ps.checkError();
ps.close();
inputStream = new FileInputStream(session);
com.dropbox.client2.DropboxAPI.Entry newEntry = mDBApi
.putFile("Analytics" + File.separator
+ session.getName(), inputStream,
session.length(), null, null);
if (session.delete()) {
} else {
session.deleteOnExit();
}
Log.i("DbExampleLog", "The uploaded file's rev is: "
+ newEntry.rev);
} else {
Log.e("DropBoxFile", "SD NOT MOUNTED!!");
}
} catch (DropboxUnlinkedException e) {
// User has unlinked, ask them to link again here.
Log.e("DbExampleLog", "User has unlinked.");
} catch (DropboxException e) {
Log.e("DbExampleLog", "Something went wrong while uploading.");
} catch (FileNotFoundException e) {
Log.e("DbExampleLog", "File not found.");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
}
}
}
return null;
}
私有类SendToDropbox扩展异步任务{
@抑制警告(“弃用”)
@凌驾
受保护的字符串doInBackground(字符串…arg0){
//TODO自动生成的方法存根
字符串时间戳=新日期();
FileInputStream inputStream=null;
DisplayMetrics dm=新的DisplayMetrics();
win.getDefaultDisplay().getMetrics(dm);
double x=Math.pow(dm.widthPixels/dm.xdpi,2);
双y=数学功率(dm.heightPixels/dm.ydpi,2);
双屏幕英寸=数学sqrt(x+y);
File sdcard=新文件(Environment.getExternalStorageDirectory()
.getPath());
文件会话=null;
试一试{
会话=File.createTempFile(“分析”+时间戳“.txt”,SD卡);
if(session.exists()){
PrintStream ps=新的PrintStream(会话);
ps.println(“屏幕尺寸:“+屏幕英寸”);
ps.println(“设备:+android.os.Build.MODEL”);
ps.println(“载体:+android.os.Build.BRAND”);
ps.println(“Locale:+Locale.getDefault().toString());
ps.println(“OS:+android.OS.Build.VERSION.SDK”);
ps.println(“${EOF}”);
ps.checkError();
ps.close();
inputStream=新文件inputStream(会话);
com.dropbox.client2.DropboxAPI.Entry newEntry=mDBApi
.putFile(“分析”+File.separator
+session.getName(),inputStream,
session.length(),null,null);
if(session.delete()){
}否则{
session.deleteOnExit();
}
Log.i(“DbExampleLog”,“上载文件的版本为:”
+newEntry.rev);
}否则{
Log.e(“DropBoxFile”,“SD未装入!!”;
}
}捕获(DropboxUnlinkedException){
//用户已取消链接,请让他们在此处再次链接。
e(“DbExampleLog”,“用户已解除链接”);
}捕获(DropBoxexException e){
e(“DbExampleLog”,“上传时出错。”);
}catch(filenotfounde异常){
e(“DbExampleLog”,“找不到文件”);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}最后{
如果(inputStream!=null){
试一试{
inputStream.close();
}捕获(IOE异常){
}
}
}
返回null;
}
这段代码唯一的问题是,它只在访问令牌更改前几周,可能一个月起作用。这意味着我必须每隔几周手动更新apk,这不是很可行。相反,我希望将密钥存储在我可以通过http访问的网站或在线文件中
是否有不需要帐户访问并允许您在web上上载和编辑.txt文件的免费程序?从Dropbox最佳实践: 您的应用程序应采取预防措施,以防访问被撤销。访问令牌可能会被用户禁用(从帐户页面),在滥用时被Dropbox管理员撤销,或者随着时间的推移而过期 在令牌不再被授权的情况下,REST API将返回HTTP错误401 Unauthorized响应。iOS SDK将为您检测401s,并将调用会话委托上的SessiondReceiveAuthorizationFailure:方法来通知您授权已被撤销。Android、Python、Ruby和Java SDK都将引发您可以捕获并检查的服务器错误异常。重新验证通常是重新获得访问权限所必需的全部
因此,访问令牌肯定会随着时间的推移而变化。你必须足够灵活地处理这一问题。访问令牌目前不会过期,尽管将来可能会发生变化。但是,你需要非常小心,千万不要将你的应用程序与用于生成令牌的帐户断开链接,因为这会使硬编码的令牌失效进入你的应用程序
但是,出于安全原因,我不建议这样做。嵌入到你的应用中的令牌可以被反向工程的人发现。任何拥有该令牌的人不仅可以读取,还可以写入Dropbox(或应用文件夹)令牌有权访问的应用程序,这样做可能会使应用程序的其他用户出错。Dropbox访问令牌实际上不会像这样在默认情况下过期,尽管它们可以手动撤销。请确保您没有断开应用程序的链接,例如,通过或在应用程序文件夹应用程序的情况下,通过删除应用程序文件夹。不,我确信它已更改。应用程序密钥s不更改,代码没有问题。我还使用AuthActivity重新测试了令牌。他知道他需要灵活,但他要求解决方法。他希望避免每隔一段时间再次登录dropbox…想法?我阅读dropbox手册时如下所示:您无法阻止从bei访问ng已吊销。因此,如果您正在使用其中一个SDK,请捕获提到的异常并启动新的授权过程,如下所示: