Saturday, 1 October 2016

How to Upload and Download Files from Dropbox.


1) Add this two jar files in lib folder in your project.Getting both files from
https://www.dropbox.com/developers-v1/core/sdks/android

1) dropbox-android-sdk-1.6.3.jar
2) json_simple-1.1.jar


2) Update build.gradle

compile files('libs/dropbox-android-sdk-1.6.3.jar')
compile files('libs/json_simple-1.1.jar')

3) AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<activity
    android:name="com.dropbox.client2.android.AuthActivity"
    android:launchMode="singleTask"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:configChanges="orientation|keyboard">
    <intent-filter>
        <!-- Change this to be db- followed by your app key -->
        <data android:scheme="db-YOUR_APPLICATION_KEY" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE"/>
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
<activity
    android:name=".DropboxActivity"
    android:exported="true"
    android:launchMode="singleTop"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.NoTitleBar" >
</activity>

4) dropbox_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="10dp"
        android:src="@drawable/tab_dropbox" />

    <Button
        android:id="@+id/backup_button"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="10dp"
        android:background="@android:color/holo_blue_dark"
        android:textSize="20sp"
        android:text="@string/backup"
        android:textColor="@android:color/white" />

    <Button
        android:id="@+id/restore_button"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="10dp"
        android:textSize="20sp"
        android:background="@android:color/holo_blue_dark"
        android:text="@string/restore"
        android:textColor="@android:color/white" />
</LinearLayout>

5) string.xml

<string name="backup">Backup</string>
<string name="restore">Restore</string>
<string name="file_upload_success_message">Backup Uploaded Successfully</string>
<string name="file_upload_failed_message">Backup Failed to Upload</string>
<string name="file_restore_success_message">Backup Restored Successfully</string>
<string name="file_restore_failed_message">Backup Failed to Restore</string>


6) DropBoxActivity.java file.
In this java file i upload and restore sqlite database file on dropbox.

import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.dropbox.client2.DropboxAPI;
import com.dropbox.client2.android.AndroidAuthSession;
import com.dropbox.client2.exception.DropboxException;
import com.dropbox.client2.session.AccessTokenPair;
import com.dropbox.client2.session.AppKeyPair;
import com.dropbox.client2.session.Session;
import com.dropbox.client2.session.TokenPair;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * Created by Bhavesh Jain on 4/10/16.
 */

public class DropBoxActivity extends Activity implements View.OnClickListener {
    private DropboxAPI<AndroidAuthSession> mDropBoxAPI;
    private final String FILE_DIR = "/DIRECTROY NAME/";
    private final String DROPBOX_PREFERENCE_NAME = "dropbox_prefs";
    private final String ACCESS_KEY = "YOUR_APPLICATION_KEY";
    private final String ACCESS_SECRET = "YOUR_APPLICATION_SECRET";
    private final String DATABASE_NAME = "backupdata.Sqlite";
    private boolean mIsLoggedIn = false, mIsUpload = false, mIdDownload = false;
    private ProgressDialog mDialog = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dropbox_activity);
        Button uploadBtn = (Button) findViewById(R.id.backup_button);
        uploadBtn.setOnClickListener(this);
        Button restoreBtn = (Button) findViewById(R.id.restore_button);
        restoreBtn.setOnClickListener(this);
        AndroidAuthSession session = buildSession();
        mDropBoxAPI = new DropboxAPI<AndroidAuthSession>(session);
    }

    private AndroidAuthSession buildSession() {
        AppKeyPair pair = new AppKeyPair(ACCESS_KEY, ACCESS_SECRET);
        AndroidAuthSession session;

        SharedPreferences prefs = getSharedPreferences(DROPBOX_PREFERENCE_NAME, 0);
        String key = prefs.getString(ACCESS_KEY, null);
        String secret = prefs.getString(ACCESS_SECRET, null);
        if (key != null && secret != null) {
            AccessTokenPair token = new AccessTokenPair(key, secret);
            session = new AndroidAuthSession(pair, Session.AccessType.APP_FOLDER, token);
        } else {
            session = new AndroidAuthSession(pair, Session.AccessType.APP_FOLDER);
        }
        return session;
    }

    @Override
    protected void onResume() {
        super.onResume();

        AndroidAuthSession session = mDropBoxAPI.getSession();
        if (session.authenticationSuccessful()) {
            try {
                session.finishAuthentication();
                TokenPair tokens = session.getAccessTokenPair();
                SharedPreferences prefs = getSharedPreferences(DROPBOX_PREFERENCE_NAME, 0);
                Editor editor = prefs.edit();
                editor.putString(ACCESS_KEY, tokens.key);
                editor.putString(ACCESS_SECRET, tokens.secret);
                editor.commit();
                mIsLoggedIn = true;
                if(mIsUpload) {
                    mIsUpload = false;
                    UploadFileToDropbox upload = new UploadFileToDropbox();
                    upload.execute();
                } else if(mIdDownload) {
                    mIdDownload = false;
                    DownloadFileToDropbox download = new DownloadFileToDropbox();
                    download.execute();
                }
            } catch (IllegalStateException e) {
                Toast.makeText(this, "Error during Dropbox authentication",
                        Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.backup_button:
                mIsUpload = true;
                // First check user is logged in or not
                if(mIsLoggedIn) {
                    mIsUpload = false;
                    UploadFileToDropbox upload = new UploadFileToDropbox();
                    upload.execute();
                } else {
                    mDropBoxAPI.getSession().startAuthentication(DropBoxActivity.this);
                }
                break;
            case R.id.restore_button:
                mIdDownload = true;
                // First check user is logged in or not
                if(mIsLoggedIn) {
                    mIdDownload = false;
                    DownloadFileToDropbox download = new DownloadFileToDropbox();
                    download.execute();
                } else {
                    mDropBoxAPI.getSession().startAuthentication(DropBoxActivity.this);
                }
                break;
            default:
                break;
        }
    }

    public class UploadFileToDropbox extends AsyncTask<Void, Void, Boolean> {

        @Override
        protected void onPreExecute() {
            if (mDialog == null) {
                mDialog = new ProgressDialog(DropBoxActivity.this);
                mDialog.setMessage("Uploading File, Please wait...");
                mDialog.show();
            }
        }

        @Override
        protected Boolean doInBackground(Void... params) {
            String dbFilePath = getDefaultAppPath(getApplicationContext()) + "/" + DATABASE_NAME;
            File fileContent = new File(dbFilePath);
            try {
                FileInputStream fis = new FileInputStream(fileContent);
                if (fis != null) {
                    DropboxAPI.Entry newEntry = mDropBoxAPI.putFileOverwrite(FILE_DIR + "/" + DATABASE_NAME, fis, fileContent.length(), null);
                    if (newEntry != null) {
                        v("File Name : " + newEntry.fileName());
                    }
                }
                return true;
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                v("FileNotFoundException in DropBox Upload : " + e.getMessage());
            } catch (DropboxException e) {
                e.printStackTrace();
                v("DropboxException in DropBox Upload : " + e.getMessage());
            }
            return false;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            if (mDialog != null && mDialog.isShowing()) {
                mDialog.dismiss();
                mDialog = null;
            }
            if (result) {
                showAlertDialog(getString(R.string.file_upload_success_message));
            } else {
                showAlertDialog(getString(R.string.file_upload_failed_message));
            }
        }
    }

    private String getDefaultAppPath(Context context) {
        File file = context.getFilesDir();
        return file.getAbsolutePath() + "/";
    }

    private void showAlertDialog(String message) {
        final Dialog dialog = new Dialog(DropBoxActivity.this);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.custom_alert_dialog);
        dialog.setCanceledOnTouchOutside(false);

        TextView errorTV = (TextView) dialog
                .findViewById(R.id.alert_message_textview);
        Button okBtn = (Button) dialog.findViewById(R.id.ok_button);
        errorTV.setText(message);

        okBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                dialog.dismiss();
            }
        });
        dialog.show();
    }

    public class DownloadFileToDropbox extends AsyncTask<Void, Void, Boolean> {

        @Override
        protected void onPreExecute() {
            if (mDialog == null) {
                mDialog = new ProgressDialog(DropBoxActivity.this);
                mDialog.setMessage("Uploading File, Please wait...");
                mDialog.show();
            }
        }

        @Override
        protected Boolean doInBackground(Void... params) {
            String dbFilePath = getDefaultAppPath(getApplicationContext()) + "/" + DATABASE_NAME;
            File file = new File(dbFilePath);
            FileOutputStream outputStream = null;
            try {
                outputStream = new FileOutputStream(file);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            DropboxAPI.DropboxFileInfo info = null;
            try {
                info = mDropBoxAPI.getFile(FILE_DIR + "/" + DATABASE_NAME, null, outputStream, null);
                v("The DB File is: " + info.getMetadata().rev);
                return true;
            } catch (DropboxException e) {
                // TODO Auto-generated catch block
                v("DropboxException : " + e.getMessage());
                e.printStackTrace();
            }
            return false;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            if (mDialog != null && mDialog.isShowing()) {
                mDialog.dismiss();
                mDialog = null;
            }
            if (result) {
                showAlertDialog(getString(R.string.file_restore_success_message));
            } else {
                showAlertDialog(getString(R.string.file_restore_failed_message));
            }
        }
    }

    private void v(String desc) {
        Log.v("DropBoxData", desc);
    }
}


7) Output