2013-07-27 141 views
1

我已經在Dropbox中成功共享視頻,但我希望將SD卡中的視頻文件夾共享到Dropbox。如果有任何解決方案,請幫助我。如何在android中的Dropbox上共享SD卡文件夾

在此先感謝。

public class UploadPicture extends AsyncTask<Void, Long, Boolean> { 

    private DropboxAPI<?> mApi; 
    private String mPath; 
    private File mFile; 

    private long mFileLen; 
    private UploadRequest mRequest; 
    private Context mContext; 
    private final ProgressDialog mDialog; 

    private String mErrorMsg; 


    public UploadPicture(Context context, DropboxAPI<?> api, String dropboxPath, 
      File file) { 
     // We set the context this way so we don't accidentally leak activities 
     mContext = context.getApplicationContext(); 

     mFileLen = file.length(); 
     mApi = api; 
     mPath = dropboxPath; 
     mFile = file; 




     mDialog = new ProgressDialog(context); 
     mDialog.setMax(100); 
     mDialog.setMessage("Uploading " + file.getName()); 
     mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     mDialog.setProgress(0); 
     mDialog.setButton("Cancel", new OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       // This will cancel the putFile operation 
       mRequest.abort(); 
      } 
     }); 
     mDialog.show(); 
    } 

    @Override 
    protected Boolean doInBackground(Void... params) { 
     try { 
      // By creating a request, we get a handle to the putFile operation, 
      // so we can cancel it later if we want to 
       System.out.println(mPath); 
       System.out.println(mFile); 




      FileInputStream fis = new FileInputStream("mnt/sdcard/aa/ashu1.mp4"); 
      String path = mPath + mFile.getName(); 
      mRequest = mApi.putFileOverwriteRequest(path, fis, mFile.length(), 
        new ProgressListener() { 
       @Override 
       public long progressInterval() { 
        // Update the progress bar every half-second or so 
        return 500; 
       } 

       @Override 
       public void onProgress(long bytes, long total) { 
        publishProgress(bytes); 
       } 
      }); 

      if (mRequest != null) { 
       mRequest.upload(); 
       return true; 
      } 

     } catch (DropboxUnlinkedException e) { 
      // This session wasn't authenticated properly or user unlinked 
      mErrorMsg = "This app wasn't authenticated properly."; 
     } catch (DropboxFileSizeException e) { 
      // File size too big to upload via the API 
      mErrorMsg = "This file is too big to upload"; 
     } catch (DropboxPartialFileException e) { 
      // We canceled the operation 
      mErrorMsg = "Upload canceled"; 
     } catch (DropboxServerException e) { 
      // Server-side exception. These are examples of what could happen, 
      // but we don't do anything special with them here. 
      if (e.error == DropboxServerException._401_UNAUTHORIZED) { 
       // Unauthorized, so we should unlink them. You may want to 
       // automatically log the user out in this case. 
      } else if (e.error == DropboxServerException._403_FORBIDDEN) { 
       // Not allowed to access this 
      } else if (e.error == DropboxServerException._404_NOT_FOUND) { 
       // path not found (or if it was the thumbnail, can't be 
       // thumbnailed) 
      } else if (e.error == DropboxServerException._507_INSUFFICIENT_STORAGE) { 
       // user is over quota 
      } else { 
       // Something else 
      } 
      // This gets the Dropbox error, translated into the user's language 
      mErrorMsg = e.body.userError; 
      if (mErrorMsg == null) { 
       mErrorMsg = e.body.error; 
      } 
     } catch (DropboxIOException e) { 
      // Happens all the time, probably want to retry automatically. 
      mErrorMsg = "Successful image Loading."; 
     } catch (DropboxParseException e) { 
      // Probably due to Dropbox server restarting, should retry 
      mErrorMsg = "Dropbox error. Try again."; 
     } catch (DropboxException e) { 
      // Unknown error 
      mErrorMsg = "Unknown error. Try again."; 
     } catch (FileNotFoundException e) { 
     } 
     return false; 
    } 

    @Override 
    protected void onProgressUpdate(Long... progress) { 
     int percent = (int)(100.0*(double)progress[0]/mFileLen + 0.5); 
     mDialog.setProgress(percent); 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     mDialog.dismiss(); 
     if (result) { 
      showToast("Image successfully uploaded"); 
     } else { 
      showToast(mErrorMsg); 
     } 
    } 

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

和MainActivity

public class MainActivity extends Activity { 
    private static final String TAG = "Ashu"; 

    /////////////////////////////////////////////////////////////////////////// 
    //      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 = ""; 
    final static private String APP_SECRET = ""; 

    // 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.APP_FOLDER; 

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

    private ImageView mImage; 

    private final String PHOTO_DIR = "/Photos/"; 

    final static private int NEW_PICTURE = 1; 
    private String mCameraFileName; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     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.main); 

     checkAppKeySetup(); 

     mSubmit = (Button)findViewById(R.id.auth_button); 

     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(MainActivity.this); 
       } 
      } 
     }); 

     mDisplay = (LinearLayout)findViewById(R.id.logged_in_display); 

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

     // This is the button to take a photo 
     mPhoto = (Button)findViewById(R.id.photo_button); 

     mPhoto.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
      //  Intent intent = new Intent(); 
       // Picture from camera 
      // intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); 

       // This is not the right way to do this, but for some reason, having 
       // it store it in 
       // MediaStore.Images.Media.EXTERNAL_CONTENT_URI isn't working right. 

      // Date date = new Date(); 
      // DateFormat df = new SimpleDateFormat("yyyy-MM-dd-kk-mm-ss"); 

      //  String newPicFile = df.format(date) + ".jpg"; 
      // String outPath = "/sdcard/" + newPicFile; 
       long currentTime = System.currentTimeMillis(); 

      // String uniqueOutFile = Environment.getExternalStorageDirectory() 
        // .toString() + "/aa"+ ".mp4"; 



       File outFile = new File("/mnt/sdcard/aa/ashu1.mp4"); 

       mCameraFileName = outFile.toString(); 


       UploadPicture upload = new UploadPicture(DBRoulette.this, mApi, PHOTO_DIR,outFile); 
       upload.execute(); 


      } 
     }); 


     // This is the button to take a photo 
     mRoulette = (Button)findViewById(R.id.roulette_button); 



     // 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 
    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == NEW_PICTURE) { 
      // return from file upload 
      if (resultCode == Activity.RESULT_OK) { 
       Uri uri = null; 
       if (data != null) { 
        uri = data.getData(); 
       } 
       if (uri == null && mCameraFileName != null) { 
        uri = Uri.fromFile(new File(mCameraFileName)); 
       } 
       File file = new File(mCameraFileName); 

       if (uri != null) { 
        UploadPicture upload = new UploadPicture(this, mApi, PHOTO_DIR, file); 
        upload.execute(); 
       } 
      } else { 
       Log.w(TAG, "Unknown Activity Result from mediaImport: " 
         + resultCode); 
      } 
     } 
    } 

    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"); 
      mDisplay.setVisibility(View.VISIBLE); 
     } else { 
      mSubmit.setText("Link with Dropbox"); 
      mDisplay.setVisibility(View.GONE); 
      mImage.setImageDrawable(null); 
     } 
    } 

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

你可以發表一些我們可以看到的代碼嗎? – Braiam

回答

0

有沒有辦法直接上傳使用Dropbox的SDK文件夾。您需要自己枚舉這些文件,然後將它們分別上傳到您創建的Dropbox文件夾中。然後,您可以共享該文件夾的鏈接。

相關問題