DropboxUnlinkedException - 如果您尚未在会话上设置访问令牌对,或者用户已撤销访问

问题描述:

我正尝试将文件上传到Dropbox。我配置了清单文件,并编写了下面的代码。请帮助我了解我在这里失踪的内容。 活动的onclickDropboxUnlinkedException - 如果您尚未在会话上设置访问令牌对,或者用户已撤销访问

Intent uploadToDropbox = new Intent(this, SUploadDB2Dropbox.class); 
      startService(uploadToDropbox) ; 

服务SUploadDB2Dropbox

private DropboxAPI<AndroidAuthSession> mDBApi; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     AppKeyPair appKeys = new AppKeyPair(God.DROPBOX_APP_KEY, 
       God.DROPBOX_APP_SECRET); 
     AndroidAuthSession session = new AndroidAuthSession(appKeys); 
     mDBApi = new DropboxAPI<AndroidAuthSession>(session); 
     mDBApi.getSession().startOAuth2Authentication(this); 
     UploadDB2DropBox upload2DropBox = new UploadDB2DropBox(this, mDBApi); 
     upload2DropBox.execute(); 
     return super.onStartCommand(intent, flags, startId); 
    } 

UploadDB2DropBox的AsyncTask

@Override 
    public String doInBackground(Object... params) { 
     File file = new File(context.getDatabasePath(God.TABLE_ACTIVATIONS) 
       + ".db"); 
     Log.d(God.TAG, 
       "Database path " 
         + context.getDatabasePath(God.TABLE_ACTIVATIONS)); 

     FileInputStream inputStream = null; 
     try { 
      String newFileName; 
      inputStream = new FileInputStream(file); 

      newFileName = "/" + God.TABLE_ACTIVATIONS 
        + Calendar.getInstance().getTimeInMillis() + ".db"; 
      Log.d(God.TAG, "File path " + file.getName() + " len " 
        + inputStream.available()); 
      Log.d(God.TAG, " New Filename " + newFileName); 
      Entry response = mDBApi.putFile(newFileName, inputStream, 
        file.length(), null, null); 
      Log.d(God.TAG, "Uploaded file is " + response.rev); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
      Log.e(God.TAG, "FileNotFoundException"); 
     } catch (DropboxException e) { 
      e.printStackTrace();n 
      Log.e(God.TAG, "DropboxException"); 
     } catch (IOException e) { 
      Log.e(God.TAG, "IOException"); 
      e.printStackTrace(); 
     } finally { 
      if (inputStream != null) { 
       try { 
        inputStream.close(); 
       } catch (IOException e) { 
        Log.e(God.TAG, "IOException"); 
       } 
      } 
     } 
     return null; 
    } 

我得到一个Dropbox的例外。屏幕确实导航到保存框Allow user屏幕(每次都可以)。

logcat的

02-23 11:44:19.435: D/AutoActivate(27289): Database path /data/data/com.swipex.autoactivate/databases/activations 
02-23 11:44:19.436: D/AutoActivate(27289): File path activations.db len 8372224 
02-23 11:44:19.546: D/AutoActivate(27289): New Filename /activations1424672059436.db 
02-23 11:44:19.702: E/AutoActivate(27289): DropboxException 

清单文件

<activity 
      android:name="com.dropbox.client2.android.AuthActivity" 
      android:configChanges="orientation|keyboard" 
      android:launchMode="singleTask" > 
      <intent-filter> 
       <data android:scheme="db-KEY_VALUE_HERE" /> 

       <action android:name="android.intent.action.VIEW" /> 

       <category android:name="android.intent.category.BROWSABLE" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 

我得到一个UnlinkException

DropboxUnlinkedException - 如果您没有设置一个访问令牌对上的会话,或者如果用户已撤销访问权限。

我错过了什么?

+0

为了说明,您的** >> EXCEPTION_HERE **标记位于Log.e行上。它实际上是发生在那条线上,还是在它上面的一条线上? – Greg 2015-02-10 23:10:24

+0

对不起,我会改正的,我看你在说什么。 – Siddharth 2015-02-11 04:39:58

+0

你指出'putFile'这一行,但是堆栈跟踪似乎没有提到这一点,甚至没有提到你发布的'UploadDB2DropBox'类。你确定这个例外来自这个代码吗?它看起来像这里有关于此错误的另一个问题:http://*.com/questions/11308260/chooseractivity-has-leaked-intentreceiver – Greg 2015-02-11 21:23:39

可怕的Dropbox文件,我必须说

public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.d(God.TAG, "Initializing Dropbox"); 
     AppKeyPair appKeys = new AppKeyPair(God.DROPBOX_APP_KEY, 
       God.DROPBOX_APP_SECRET); 
     AndroidAuthSession session = new AndroidAuthSession(appKeys); 
     mDBApi = new DropboxAPI<AndroidAuthSession>(session); 
     mDBApi.getSession().startOAuth2Authentication(this); 
     if (mDBApi != null && mDBApi.getSession().authenticationSuccessful()) { 
      try { 
       // Required to complete auth, sets the access token on the session 
       mDBApi.getSession().finishAuthentication(); 
       UploadDB2DropBox upload2DropBox = new UploadDB2DropBox(this, 
         mDBApi); 
       upload2DropBox.execute(); 

       //String accessToken = mDBApi.getSession().getOAuth2AccessToken(); 
      } catch (IllegalStateException e) { 
       Log.i(God.TAG, "Error authenticating", e); 
      } 
     } 
     return super.onStartCommand(intent, flags, startId); 
    } 

这帮助。我想知道为什么Dropbox不断要求从UI获得许可。如果我必须继续询问权限,那么使用这个api会很愚蠢。

+0

是的,你能提出正确的答案,我很高兴删除这个答案。 – Siddharth 2015-02-24 12:14:35

+1

@smarx,你是一个保管箱开发者,你能回答这个问题,而不是一个downvoter和一个批评者吗? – Siddharth 2015-02-24 15:23:36

+0

我完全同意你的看法。 – 2015-04-01 21:53:26