首页 文章

如何将图像上传到Dropbox?

提问于
浏览
1

我正在尝试将所选图像从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);
}

And uploadDropbox body is:

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 method body:

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

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

    感谢您的评论 .

相关问题