2013-07-15 152 views
1

我正在開發一個使用Dropbox Sync API上傳文件的Android應用程序。我已經在Dropbox上創建了應用程序,獲得了APP_KEY和APP_SECRET。我已經包含了所有必要的庫,在我的活動代碼和Manifest中設置正確的鍵。我的應用程序類似於文檔中提供的HelloDropbox示例,但是當我單擊「鏈接到Dropbox」按鈕時,應該顯示一個地方以輸入我的Dropbox憑據,但沒有任何反應。這裏的源代碼:Dropbox Sync API startLink()方法不起作用

package com.diamondtrust66.helix.player; 
import java.io.File; 
import java.io.IOException; 
import java.util.List; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.dropbox.client2.DropboxAPI; 
import com.dropbox.sync.android.DbxAccountManager; 
import com.dropbox.sync.android.DbxFile; 
import com.dropbox.sync.android.DbxFileInfo; 
import com.dropbox.sync.android.DbxFileSystem; 
import com.dropbox.sync.android.DbxPath; 

public class HelixPlayer extends Activity { 

private static final String appKey = "1234-my-key"; 
private static final String appSecret = "1234-my-secret"; 

private static final int REQUEST_LINK_TO_DBX = 0; 

private TextView mTestOutput; 
private Button mLinkButton; 
private DbxAccountManager mDbxAcctMgr; 
private DropboxAPI<?> mDBApi; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_helix_player); 
    mTestOutput = (TextView) findViewById(R.id.test_output); 
    mLinkButton = (Button) findViewById(R.id.link_button); 
    mLinkButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickLinkToDropbox(); 
     } 
    }); 

    mDbxAcctMgr = DbxAccountManager.getInstance(getApplicationContext(), appKey, appSecret); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    if (mDbxAcctMgr.hasLinkedAccount()) { 
     showLinkedView(); 
     doDropboxTest(); 
    } else { 
     showUnlinkedView(); 
    } 
} 

private void showLinkedView() { 
    mLinkButton.setVisibility(View.GONE); 
    mTestOutput.setVisibility(View.VISIBLE); 
} 

private void showUnlinkedView() { 
    mLinkButton.setVisibility(View.VISIBLE); 
    mTestOutput.setVisibility(View.GONE); 
} 

private void onClickLinkToDropbox() { 
    mDbxAcctMgr.startLink((Activity)this, REQUEST_LINK_TO_DBX); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_LINK_TO_DBX) { 
     if (resultCode == Activity.RESULT_OK) { 
      doDropboxTest(); 
     } else { 
      Toast.makeText(getApplicationContext(), "FAILURE", Toast.LENGTH_LONG).show(); 
      mTestOutput.setText("Link to Dropbox failed or was cancelled."); 
     } 
    } else { 
     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

private void doDropboxTest() { 
    try { 
     final String TEST_DATA = "Hello Dropbox"; 
     final String TEST_FILE_NAME = "be like that.mp3"; 
     DbxPath testPath = new DbxPath(DbxPath.ROOT, TEST_FILE_NAME); 

     // Create DbxFileSystem for synchronized file access. 
     DbxFileSystem dbxFs = DbxFileSystem.forAccount(mDbxAcctMgr.getLinkedAccount()); 





     // Print the contents of the root folder. This will block until we can 
     // sync metadata the first time. 
     List<DbxFileInfo> infos = dbxFs.listFolder(DbxPath.ROOT); 
     mTestOutput.setText("\nContents of app folder:\n"); 
     for (DbxFileInfo info : infos) { 
      mTestOutput.append(" " + info.path + ", " + info.modifiedTime + '\n'); 
     } 

     // Create a test file only if it doesn't already exist. 
     if (!dbxFs.exists(testPath)) { 
      DbxFile testFile = dbxFs.create(testPath); 
      try { 

       File myFile = new File("/mnt/sdcard/alarms/be like that.mp3"); 
       //testFile.writeString(TEST_DATA); 
       testFile.writeFromExistingFile(myFile, false); 
      } finally { 
       testFile.close(); 
      } 
      mTestOutput.append("\nCreated new file '" + testPath + "'.\n"); 
     } 

     // Read and print the contents of test file. Since we're not making 
     // any attempt to wait for the latest version, this may print an 
     // older cached version. Use getSyncStatus() and/or a listener to 
     // check for a new version. 
     /*if (dbxFs.isFile(testPath)) { 
      String resultData; 
      DbxFile testFile = dbxFs.open(testPath); 
      try { 
       resultData = testFile.readString(); 
      } finally { 
       testFile.close(); 
      } 
      mTestOutput.append("\nRead file '" + testPath + "' and got data:\n " + resultData); 
     } else if (dbxFs.isFolder(testPath)) { 
      mTestOutput.append("'" + testPath.toString() + "' is a folder.\n"); 
     }*/ 
    } catch (IOException e) { 
     mTestOutput.setText("Dropbox test failed: " + e); 
    } 
} 

}

回答

0

你能,你遇到了這一問題同模擬器/設備上運行未經修改的喂Dropbox的例子嗎?您也可以嘗試用自己的代碼替換示例中的應用程序密鑰/祕密。如果這些也失敗了,那麼設備的配置可能會出現問題,導致API無法啓動瀏覽器來完成身份驗證。如果這個例子有效,但你的應用程序沒有,那麼我會懷疑在那裏配置錯誤。你可以用日誌語句檢查你的startLink()調用是否真的發生了嗎?在那之後你看到任何出現在LogCat中的東西?

進一步調試的最佳方法可能是打開一個支票。使用API​​支持鏈接:https://www.dropbox.com/developers

+0

我發現當我卸載Hello Dropbox示例時,我的應用程序工作。我正在使用ICS 4.0.4,我無法弄清楚爲什麼這兩個應用程序無法在同一部手機上工作。 – diamondtrust66

+0

如果您看到兩個應用程序相互衝突,我會懷疑您的AndroidManifest.xml中可能沒有正確的應用程序密鑰。您的應用需要使用包含您的應用密鑰的自定義架構來註冊URL。如果兩個應用程序註冊相同的模式,則認證將失敗。 – atwyman

0

我遇到了同樣的問題,當我嘗試使用與我的設備安裝的另一個Android應用程序一起使用的相同的Dropbox應用程序憑據時,startLink()運行),但它沒有工作。所以你有兩個選擇:使用相同的憑據卸載任何其他的Android應用程序,或創建另一個Dropbox應用程序,並更新一組應用程序/密鑰。只有這樣Dropbox登錄對話框纔會出現。