无法从android发送文件到Dropbox

时间:2013-12-24 13:01:40

标签: android dropbox

我正在尝试将文本文件发送到drop-box,但它无法正常工作。据我所知,我已经正确完成了所有编码。有人请给我你的电子邮件ID或回复我Lalit12131@gmail.com 我将把所有文件和详细信息发给你,让我解决这个问题。

请帮助 提前谢谢。

void toDropbox()
{
    b1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            String filePath =getApplicationContext().getFilesDir().getPath().toString() + "/DropboxFile1.txt";
            File file = new File(filePath);

             try {
                file.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();}

             FileInputStream inputStream = null;
            try {
                inputStream = new FileInputStream(file);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            Toast.makeText(getBaseContext(), "In clickListener", Toast.LENGTH_SHORT).show();
             try {
                DropboxAPI.Entry response = mDBApi.putFile("/DropboxFile1.txt", inputStream, file.length(), null, null);
            } catch (DropboxException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

3 个答案:

答案 0 :(得分:1)

This表示您正在获取用户取消关联的例外,因为您需要检查是否正确设置了Dropbox以允许您的应用访问和/或您没有提供设置访问权限时(在Dropbox站点上)提供给您的正确访问令牌对。

“这可能是因为您没有在会话中设置com.dropbox.client2.session.AccessTokenPair,或者因为用户取消了您的应用链接(撤销了访问令牌对)。”

首先转到Dropbox并按照此处的说明操作:Developer Guide并确保您具有设置应用程序权限,并确保用户(您)已允许访问该应用程序(已链接)。您应该获得一个访问密钥访问密钥,您需要将其放入您的应用程序。 @Hassaan Rabbani提供的答案有一个使用app密钥和秘密令牌对验证您的应用程序的示例。请注意,当您尝试使用其代码时,我确信您必须更改变量

final static private String APP_KEY = "xxxxxxxxx";
final static private String APP_SECRET = "xxxxxxxxx";

给你的令牌对。如果您确实将这些值更改为正确的值,则表示该错误是服务器端,因此请仔细检查我提供的链接的权限。

要获取应用密钥和密码,您需要在Dropbox上设置应用。转到创建新应用并选择:

Dropbox API,文件和数据存储,否,所有文件类型,Your_App_Name

下一页将显示您的密钥。

答案 1 :(得分:0)

使用此代码,你很高兴,删除一些错误,因为我使用此代码上传图像,文本文件和PDF文件。我删除了很多代码,

public class Dropboxupload extends Activity {
    private static final String TAG = "Dropbox";


    ///////////////////////////////////////////////////////////////////////////
    //                      Your app-specific settings.                      //
    ///////////////////////////////////////////////////////////////////////////

    // Replace this with your app key and secret assigned by Dropbox.
    // Note that this is a really insecure way to do this, and you shouldn't
    // ship code which contains your key & secret in such an obvious way.
    // Obfuscation is good.
    final static private String APP_KEY = "xxxxxxxxx";
    final static private String APP_SECRET = "xxxxxxxxx";

    // If you'd like to change the access type to the full Dropbox instead of
    // an app folder, change this value.
    final static private AccessType ACCESS_TYPE = AccessType.DROPBOX;

    ///////////////////////////////////////////////////////////////////////////
    //                      End app-specific settings.                       //
    ///////////////////////////////////////////////////////////////////////////

    // You don't need to change these, leave them alone.
    final static private String ACCOUNT_PREFS_NAME = "prefs";
    final static private String ACCESS_KEY_NAME = "ACCESS_KEY";
    final static private String ACCESS_SECRET_NAME = "ACCESS_SECRET";


    DropboxAPI<AndroidAuthSession> mApi;

    private boolean mLoggedIn;

    // Android widgets
    private Button mSubmit;
    private LinearLayout mDisplay;
    private Button mPhoto;
    private Button mRoulette;
    String filename = Scene.name;
    private ImageView mImage;

    private final String PHOTO_DIR = "/Your directory here/";

    final static private int NEW_PICTURE = 1;
    private String mCameraFileName;
    DatabaseHandler db = new DatabaseHandler(this);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ActionBar actionBar = getActionBar();
        actionBar.setBackgroundDrawable(new ColorDrawable(Color.GREEN));
        actionBar.setDisplayShowCustomEnabled(true);


        actionBar.setCustomView(R.layout.forsettings);
        TextView actiontitle=(TextView)findViewById(R.id.textscene);
        actiontitle.setText("Upload");
        Button homebutton = (Button)findViewById(R.id.home);



        homebutton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                // TODO Auto-generated method stub
                view.getContext().startActivity(new Intent(view.getContext().getApplicationContext(),Main.class));
            }
        });



        if (savedInstanceState != null) {
            mCameraFileName = savedInstanceState.getString("mCameraFileName");
        }

        // We create a new AuthSession so that we can use the Dropbox API.
        AndroidAuthSession session = buildSession();
        mApi = new DropboxAPI<AndroidAuthSession>(session);

        // Basic Android widgets
        setContentView(R.layout.activity_dropboxupload);

        checkAppKeySetup();

        mSubmit = (Button)findViewById(R.id.auth_button);
        mSubmit.setBackgroundColor(Color.rgb(175, 246, 179));

        Button mEmail = (Button)findViewById(R.id.email_button);
        mEmail.setBackgroundColor(Color.rgb(175, 246, 179));


        mSubmit.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // This logs you out if you're logged in, or vice versa
                if (mLoggedIn) {
                    logOut();
                } else {
                    // Start the remote authentication
                    mApi.getSession().startAuthentication(Dropboxupload.this);
                }
            }
        });
        mSubmit.setVisibility(View.INVISIBLE);
        mDisplay = (LinearLayout)findViewById(R.id.logged_in_display);

        // This is where a photo is displayed
        mImage = (ImageView)findViewById(R.id.image_view);




        // Display the proper UI state if logged in or not
        setLoggedIn(mApi.getSession().isLinked());


    }



    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putString("mCameraFileName", mCameraFileName);
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onResume() {
        super.onResume();
        AndroidAuthSession session = mApi.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) {
                showToast("Couldn't authenticate with Dropbox:" + e.getLocalizedMessage());
                Log.i(TAG, "Error authenticating", e);
            }
        }
    }

    // This is what gets called on finishing a media piece to import
    public void uploadData() {

        String filename = Scene.name;
        filename.replaceAll(".txt", "");
        filename.replaceAll(".pdf", "");
        filename.replaceAll(".fdx", "");

        db.getContact(filename);
        Contact cn = db.getContact(filename);
        String text = cn.getscript();



        //// get file path from here
                String filePath = getApplicationContext().getFilesDir().getPath().toString() + filename + ".txt";

                File file = new File(filePath);
                file.canWrite();
                FileWriter writer = null;
                try {
                    writer = new FileWriter(file);
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }          

                try {
                    writer.append(text);
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

                   try {
                    file.createNewFile();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                   try {
                    writer.flush();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                   try {
                    writer.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                    UploadPicture upload = new UploadPicture(this, mApi, PHOTO_DIR, file);
                    upload.execute();
                   //v.getContext().startActivity(new Intent(v.getContext().getApplicationContext(),Scene.class));
            }



    private void logOut() {
        // Remove credentials from the session
        mApi.getSession().unlink();

        // Clear our stored keys
        clearKeys();
        // Change UI state to display logged out version
        setLoggedIn(false);
    }

    /**
     * Convenience function to change UI state based on being logged in
     */
    private void setLoggedIn(boolean loggedIn) {
        mLoggedIn = loggedIn;
        if (loggedIn) {
            mSubmit.setText("Unlink from Dropbox");
            mSubmit.setVisibility(View.INVISIBLE);
           // mDisplay.setVisibility(View.VISIBLE);
        } else {
            mSubmit.setText("Link with Dropbox");
            mDisplay.setVisibility(View.GONE);
            mImage.setImageDrawable(null);
        }
    }

    ////////////////////
    ////////       Do not look at functions under this
    ///////////////////


    private void checkAppKeySetup() {
        // Check to make sure that we have a valid app key
        if (APP_KEY.startsWith("CHANGE") ||
                APP_SECRET.startsWith("CHANGE")) {
            showToast("You must apply for an app key and secret from developers.dropbox.com, and add them to the Dropbox ap before trying it.");
            finish();
            return;
        }

        // Check if the app has set up its manifest properly.
        Intent testIntent = new Intent(Intent.ACTION_VIEW);
        String scheme = "db-" + APP_KEY;
        String uri = scheme + "://" + AuthActivity.AUTH_VERSION + "/test";
        testIntent.setData(Uri.parse(uri));
        PackageManager pm = getPackageManager();
        if (0 == pm.queryIntentActivities(testIntent, 0).size()) {
            showToast("URL scheme in your app's " +
                    "manifest is not set up correctly. You should have a " +
                    "com.dropbox.client2.android.AuthActivity with the " +
                    "scheme: " + scheme);
            finish();
        }
    }

    private void showToast(String msg) {
        Toast error = Toast.makeText(this, msg, Toast.LENGTH_LONG);
        error.show();
    }

    /**
     * Shows keeping the access keys returned from Trusted Authenticator in a local
     * store, rather than storing user name & password, and re-authenticating each
     * time (which is not to be done, ever).
     *
     * @return Array of [access_key, access_secret], or null if none stored
     */
    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) {
            String[] ret = new String[2];
            ret[0] = key;
            ret[1] = secret;
            return ret;
        } else {
            return null;
        }
    }

    /**
     * Shows keeping the access keys returned from Trusted Authenticator in a local
     * store, rather than storing user name & password, and re-authenticating each
     * time (which is not to be done, ever).
     */
    private 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 void clearKeys() {
        SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_NAME, 0);
        Editor edit = prefs.edit();
        edit.clear();
        edit.commit();
    }

    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;
    }
}

答案 2 :(得分:0)

使用Dropbox api,创建mApi对象并使用上传功能

public void uploadFileToDropbox(File file, String uploadPath){
    mApi.putFile(uploadPath, new FileInputStream(file), file.length(), null, null);
}