A flutter plugin for accessing Dropbox.
Register a Dropbox API app from https://www.dropbox.com/developers . You need a Dropbox app key. Public clients using PKCE do not need an app secret, and must not embed one in the application.
For Android, add below in AndroidManifest.xml (replace DROPBOXKEY with your key)
<activity
android:name="com.dropbox.core.android.AuthActivity"
android:configChanges="orientation|keyboard"
android:launchMode="singleTask">
<intent-filter>
<!-- Change this to be db- followed by your app key -->
<data android:scheme="db-DROPBOXKEY" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
If you need more help setting up Android, please read https://github.com/dropbox/dropbox-sdk-java#setup .
For iOS,
-
add below in Info.plist
<key>LSApplicationQueriesSchemes</key> <array> <string>dbapi-8-emm</string> <string>dbapi-2</string> </array> -
add below in Info.plist (replace DROPBOXKEY with your key)
<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>db-DROPBOXKEY</string> </array> <key>CFBundleURLName</key> <string></string> </dict> </array>
3.a) If you are using Swift, add below code to AppDelegate.swift
import ObjectiveDropboxOfficial
// should be inside AppDelegate class
override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
if let authResult = DBClientsManager.handleRedirectURL(url) {
if authResult.isSuccess() {
print("dropbox auth success")
} else if (authResult.isCancel()) {
print("dropbox auth cancel")
} else if (authResult.isError()) {
print("dropbox auth error \(authResult.errorDescription)")
}
}
return true
}
// if your are linked with ObjectiveDropboxOfficial 6.x use below code instead
override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
DBClientsManager.handleRedirectURL(url, completion:{ (authResult) in
if let authResult = authResult {
if authResult.isSuccess() {
print("dropbox auth success")
} else if (authResult.isCancel()) {
print("dropbox auth cancel")
} else if (authResult.isError()) {
print("dropbox auth error \(authResult.errorDescription)")
}
}
});
return true
}
3.b) If you are using Objective C, add below code to AppDelegate.m
#import <ObjectiveDropboxOfficial/ObjectiveDropboxOfficial.h>
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
DBOAuthResult *authResult = [DBClientsManager handleRedirectURL:url];
if (authResult != nil) {
if ([authResult isSuccess]) {
NSLog(@"Success! User is logged into Dropbox.");
} else if ([authResult isCancel]) {
NSLog(@"Authorization flow was manually canceled by user!");
} else if ([authResult isError]) {
NSLog(@"Error: %@", authResult);
}
}
return NO;
}
// if your are linked with ObjectiveDropboxOfficial 6.x use below code instead
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
BOOL result = [DBClientsManager handleRedirectURL:url completion: ^(DBOAuthResult *authResult) {
if (authResult != nil) {
if ([authResult isSuccess]) {
NSLog(@"Success! User is logged into Dropbox.");
} else if ([authResult isCancel]) {
NSLog(@"Authorization flow was manually canceled by user!");
} else if ([authResult isError]) {
NSLog(@"Error: %@", authResult);
}
}
}];
return NO;
}
-
Update Deployment Target to iOS 9.0 or above from Xcode. (dropbox_client 0.7.0 and above)
-
Add below permissions to your app from Dropbox App Console:
- files.metadata.read
- files.metadata.write
- files.content.read
- files.content.write
If you need more help setting up for iOS, please read https://github.com/dropbox/dropbox-sdk-obj-c#get-started .
import 'package:dropbox_client/dropbox_client.dart';
Future initDropbox() async {
// Initialize a public client for PKCE. Call only once.
await Dropbox.init(dropbox_clientId, dropbox_key);
}
The optional third argument is retained for legacy confidential-client flows:
await Dropbox.init(dropbox_clientId, dropbox_key, dropbox_secret);
// Legacy Authorization
String accessToken;
Future testLogin() async {
// this will run Dropbox app if possible, if not it will run authorization using a web browser.
await Dropbox.authorize();
}
Future getAccessToken() async {
accessToken = await Dropbox.getAccessToken();
}
Future loginWithAccessToken() async {
await Dropbox.authorizeWithAccessToken(accessToken);
}
Future testLogout() async {
// unlink removes authorization
await Dropbox.unlink();
}
// OAuth 2 code flow with PKCE that grants a short-lived token
String credentials;
Future testLogin() async {
// this will run Dropbox app if possible, if not it will run authorization using a web browser.
await Dropbox.authorizePKCE();
}
Future getCredentials() async {
credentials = await Dropbox.getCredentials();
}
Future loginWithCredentials() async {
await Dropbox.authorizeWithCredentials(credentials);
}
Future testLogout() async {
// unlink removes authorization
await Dropbox.unlink();
}
// List / Upload / Download
Future testListFolder() async {
final result = await Dropbox.listFolder(''); // list root folder
print(result);
final url = await Dropbox.getTemporaryLink('/file.txt');
print(url);
}
Future testUpload() async {
final filepath = '/path/to/local/file.txt';
final result = await Dropbox.upload(filepath, '/file.txt', (uploaded, total) {
print('progress $uploaded / $total');
});
}
Future testDownload() async {
final filepath = '/path/to/local/file.txt';
final result = await Dropbox.download('/dropbox_file.txt', filepath, (downloaded, total) {
print('progress $downloaded / $total');
});
}
Example can be found in example folder.