如何将图像上传到Dropbox?

时间:2013-01-23 09:37:38

标签: java android xml apache dropbox

我正在尝试将所选图片从gallery中上传到Dropbox。我因为无法恢复运行时异常而被困了几天

我的onActivityResult()是

 if(requestCode == PIC_UPLOAD) {

    System.out.println("Reahced 1");

    Uri selectedImage = data.getData();
    String[] filePathColumn ={MediaStore.Images.Media.DATA};

    Cursor cursor = getContentResolver().query(selectedImage,
                     filePathColumn, null, null, null); cursor.moveToFirst();

    System.out.println("Reahced 2");

    int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
   String filePath = cursor.getString(columnIndex); 
   cursor.close();


    Uri imageUri=data.getData();
   List<NameValuePair> params = new ArrayList<NameValuePair>(1); 
   params.add(new  BasicNameValuePair("image", imageUri.getPath()));
    System.out.println("Reahced 3");


    /* String outPath = imageUri.toString(); File outFile = new
       File(outPath); FileInputStream fis = new FileInputStream(outFile);
       mDBApi.putFileOverwriteRequest("/Pic1", fis, outFile.length(),null);
    */

   Uri photoUri = data.getData(); 
   String[] proj = {MediaStore.Images.Media.DATA };
   Cursor actualimagecursor = managedQuery(photoUri, proj,null, null, null);
   int actual_image_column_index =
   actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
   actualimagecursor.moveToFirst();
   String img_path =actualimagecursor.getString(actual_image_column_index);

   System.out.println("Image location: " + img_path);

   System.out.println("Reached 1"); 

   uploadDropbox(img_path);
}

uploadDropbox正文为:

    private void uploadDropbox(String URL) {
    // TODO Auto-generated method stub
        AppKeyPair appKeys = new AppKeyPair(APP_KEY, APP_SECRET);
        AndroidAuthSession session = new AndroidAuthSession(appKeys, ACCESS_TYPE);
        mDBApi = new DropboxAPI<AndroidAuthSession>(session);

        System.out.println(URL);

        System.out.println("Reahced 4");

        mDBApi.getSession().startAuthentication(MyCamActivity.this);

        System.out.println("Reahced 5");

//      AccessTokenPair access = getStoredKeys();
//      mDBApi.getSession().setAccessTokenPair(access);

        FileInputStream inputStream = null;
        try {
            File file = new File(URL.toString());
            inputStream = new FileInputStream(file);
            com.dropbox.client2.DropboxAPI.Entry newEntry = mDBApi.putFile("/testing.txt", inputStream, file.length(), null, null);
            Log.i("DbExampleLog", "The uploaded file's rev is: " + newEntry.rev);
        } catch (DropboxUnlinkedException e) {
            // User has unlinked, ask them to link again here.
            Log.e("DbExampleLog", "User has unlinked.");
        } catch (DropboxException e) {
            Log.e("DbExampleLog", "Something went wrong while uploading.");
        } catch (FileNotFoundException e) {
            Log.e("DbExampleLog", "File not found.");
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {}
            }
        }
    }

onResume方法正文:

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

    if (mDBApi.getSession().authenticationSuccessful()) {
      try {
        // MANDATORY call to complete auth.
        // Sets the access token on the session
        mDBApi.getSession().finishAuthentication();

        AccessTokenPair tokens = mDBApi.getSession().getAccessTokenPair();

        // Provide your own storeKeys to persist the access token pair
        // A typical way to store tokens is using SharedPreferences
        storeKeys(tokens.key, tokens.secret);
        } catch (IllegalStateException e) {
          Log.i("DbAuthLog", "Error authenticating", e);
        }
    }

}

private AccessTokenPair getStoredKeys(){     // TODO自动生成的方法存根

return  mDBApi.getSession().getAccessTokenPair();

}

private void storeKeys(String key,String secret){     // TODO自动生成的方法存根

    // 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();
}

的AndroidManifest.xml

    <activity
  android:name="com.dropbox.client2.android.AuthActivity"
  android:launchMode="singleTask"
  android:configChanges="orientation|keyboard">
  <intent-filter>
    <!-- Change this to be db- followed by your app key -->
    <data android:scheme="db-MyKey" />
    <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=".MyCamActivity"
        android:label="@string/app_name" 
        android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
        android:uiOptions="splitActionBarWhenNarrow"
        android:clearTaskOnLaunch="true"
        >

错误 **

01-23 14:58:00.855: D/dalvikvm(4238): GC_FOR_ALLOC freed 104K, 2% free 12729K/12935K, paused 16ms
01-23 14:58:00.894: I/System.out(4238): Its not null
01-23 14:58:00.901: D/AndroidRuntime(4238): Shutting down VM
01-23 14:58:00.901: W/dalvikvm(4238): threadid=1: thread exiting with uncaught exception (group=0x40a511f8)
01-23 14:58:00.901: E/AndroidRuntime(4238): FATAL EXCEPTION: main
01-23 14:58:00.901: E/AndroidRuntime(4238): java.lang.RuntimeException: Unable to resume activity {cam.pack/cam.pack.MyCamActivity}: java.lang.NullPointerException
01-23 14:58:00.901: E/AndroidRuntime(4238):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2444)
01-23 14:58:00.901: E/AndroidRuntime(4238):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2472)
01-23 14:58:00.901: E/AndroidRuntime(4238):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1986)
01-23 14:58:00.901: E/AndroidRuntime(4238):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
01-23 14:58:00.901: E/AndroidRuntime(4238):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
01-23 14:58:00.901: E/AndroidRuntime(4238):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-23 14:58:00.901: E/AndroidRuntime(4238):     at android.os.Looper.loop(Looper.java:137)
01-23 14:58:00.901: E/AndroidRuntime(4238):     at android.app.ActivityThread.main(ActivityThread.java:4424)
01-23 14:58:00.901: E/AndroidRuntime(4238):     at java.lang.reflect.Method.invokeNative(Native Method)
01-23 14:58:00.901: E/AndroidRuntime(4238):     at java.lang.reflect.Method.invoke(Method.java:511)
01-23 14:58:00.901: E/AndroidRuntime(4238):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-23 14:58:00.901: E/AndroidRuntime(4238):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-23 14:58:00.901: E/AndroidRuntime(4238):     at dalvik.system.NativeStart.main(Native Method)
01-23 14:58:00.901: E/AndroidRuntime(4238): Caused by: java.lang.NullPointerException
01-23 14:58:00.901: E/AndroidRuntime(4238):     at cam.pack.MyCamActivity.onResume(MyCamActivity.java:571)
01-23 14:58:00.901: E/AndroidRuntime(4238):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1154)
01-23 14:58:00.901: E/AndroidRuntime(4238):     at android.app.Activity.performResume(Activity.java:4539)
01-23 14:58:00.901: E/AndroidRuntime(4238):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2434)
01-23 14:58:00.901: E/AndroidRuntime(4238):     ... 12 more

1 个答案:

答案 0 :(得分:0)

我犯了一个错误,我把dropbox会话放在我自己定义的函数uploadDropbox()中,这就是一个错误导致NullPointerException,因为如果我打印mDBApi所以它的NULL。它没有初始化。我们必须将这些行放在onCreate()中,现在它正在工作,图像将在Dropbox的CameraUploads文件夹中上传。

感谢您的评论。