2014-04-24 3 views
0

갤러리에서 이미지를 탐색하려고합니다. 00 : :하지만 다음과 같은 런타임 예외를갤러리에서 이미지를 선택할 때 예외가 발생했습니다.

04-24 08 얻을 11.787 : E는/AndroidRuntime (1546) : 치명적인 예외 : 주를 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) 프로세스 : com.dropbox.android.sample, PID : 1546 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : java.lang.RuntimeException : 결과 전달 실패 ResultInfo {who = null, request = 1, result = -1, data = Intent {dat = content : // media/external/images/media/125}} {com.dropbox.android.sample/com.dropbox.android.sample.DBRoulette} : java.lang .NullPointerException 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : android.app.ActivityThread.deliverResults (ActivityThread.java:3365) 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : android.app.Act에서 ivityThread.handleSendResult (ActivityThread.java:3408) 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : android.app.ActivityThread.access $ 1300 (ActivityThread.java:135) 04-24 08:00 : 11.787 : E/AndroidRuntime (1546) : android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1244) 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : android.os.Handler .dispatchMessage (Handler.java:102) 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : android.os.Looper.loop (Looper.java:136) 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : android.app.ActivityThread.main (ActivityThread.java:5017) 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : java.lang.reflect.Method.invokeNative에서 (네이티브 메소드) 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : java.lang.reflect.Method.invoke (Method.java:515) 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:779) 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : com.android.internal.os.ZygoteInit.main (ZygoteInit.java:595) 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : at dalvik.system.NativeStart.main 네이티브 메소드) 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : 원인 : java.lang.NullPointerException 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : java.io. File.fixSlashes (File.java:185) 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : java.io.File. (File.java:134) 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : com.dropbox.android.sample.DBRoulette.onActivityResult (DBRoulette.java:298) 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1) 546) : android.app.Activity.dispatchActivityResult (Activity.java:5423) 04-24 08 : 00 : 11.787 : E/AndroidRuntime (1546) : android.app.ActivityThread.deliverResults (ActivityThread.java:3361) 04-24 08 : 00 : 11.787 : (1546) E/AndroidRuntime : ... (11) 더

코드는 DBRoulette.java:298에서

package com.dropbox.android.sample; 

import java.io.File; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.Locale; 

import android.app.Activity; 
import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.ActivityNotFoundException; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.content.pm.PackageManager; 
import android.database.Cursor; 
import android.graphics.BitmapFactory; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.os.Handler; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.Toast; 

import com.dropbox.client2.DropboxAPI; 
import com.dropbox.client2.android.AndroidAuthSession; 
import com.dropbox.client2.android.AuthActivity; 
import com.dropbox.client2.session.AccessTokenPair; 
import com.dropbox.client2.session.AppKeyPair; 


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

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

    /////////////////////////////////////////////////////////////////////////// 
    //      End app-specific settings.      // 
    /////////////////////////////////////////////////////////////////////////// 

    public static final int MEDIA_TYPE_IMAGE = 1; 
    public static final int MEDIA_TYPE_VIDEO = 2; 

    // directory name to store captured images and videos 
    private static final String IMAGE_DIRECTORY_NAME = "Hello Camera"; 

    private Uri fileUri; // file url to store image/video 

    static String imagePath; 






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

    private static final boolean USE_OAUTH1 = false; 

    DropboxAPI<AndroidAuthSession> mApi; 

    private boolean mLoggedIn; 
    private File file; 
    // Android widgets 
    private Button mSubmit; 
    private LinearLayout mDisplay; 
    private Button mPhoto; 
    private Button mRoulette; 
    private Button btnBrowse; 
    private ImageView mImage; 
    Handler hand = new Handler(); 
    private final String PHOTO_DIR = "/Photos/"; 

    final static private int NEW_PICTURE = 1; 
    final static private int RESULT_LOAD_IMAGE = 1; 

    protected static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100; 


    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 
        if (USE_OAUTH1) { 
         mApi.getSession().startAuthentication(DBRoulette.this); 
        } else { 
         mApi.getSession().startOAuth2Authentication(DBRoulette.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); 

     btnBrowse = (Button)findViewById(R.id.btnBrowse); 

     mPhoto.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       Intent intent = new Intent(); 

       intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); 

       // 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 = "Input" + df.format(date) + ".jpg"; 
       String outPath = new File(Environment.getExternalStorageDirectory(), newPicFile).getPath(); 
       File outFile = new File(outPath); 

       mCameraFileName = outFile.toString(); 
       Uri outuri = Uri.fromFile(outFile); 

       intent.putExtra(MediaStore.EXTRA_OUTPUT, outuri); 
       Log.i(TAG, "Importing New Picture: " + mCameraFileName); 
       try { 
        startActivityForResult(intent, NEW_PICTURE); 
       } catch (ActivityNotFoundException e) { 
        showToast("There doesn't seem to be a camera."); 
       } 


       /*Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

       fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 

       intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

       // start the image capture Intent 
       startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);*/ 


      } 

     }); 



     btnBrowse.setOnClickListener(new View.OnClickListener()  //remove this 
     { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       startActivityForResult(i, RESULT_LOAD_IMAGE); 

      } 
     }); 


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

     mRoulette.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       //DownloadRandomPicture download = new DownloadRandomPicture(DBRoulette.this, mApi, PHOTO_DIR, mImage); 
       //download.execute(); 
      } 
     });*/ 

     // 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 
       storeAuth(session); 
       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) { 

     super.onActivityResult(requestCode, resultCode, 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 = new File(mCameraFileName); 

       file = new File(mCameraFileName); 
       //if (uri != null) { 


        UploadPicture upload = new UploadPicture(this, mApi, PHOTO_DIR, file, mImage); 
        upload.execute(); 




       //} 
      } else { 
       Log.w(TAG, "Unknown Activity Result from mediaImport: " 
         + resultCode); 
      } 
     } 
     if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { 
      Uri selectedImage = data.getData(); 
      String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

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

      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 



      //the path where the image is located is stored in string variable 

      String picturePath = cursor.getString(columnIndex);   
      cursor.close(); 
      mImage.setImageBitmap(BitmapFactory.decodeFile(picturePath)); 
      //Displaying the selected image in the image view. 




      //Displaying the path of the selected image 
      //////////////////////////////////////////////////////////// 
      /*File file2 = new File(picturePath); 
      if (resultCode == Activity.RESULT_OK) { 
       Uri uri = null; 
       if (data != null) { 
        uri = data.getData(); 
       } 
       if (uri == null && picturePath != null) { 
        uri = Uri.fromFile(new File(picturePath)); 
       } 


       if (uri != null) { 
        UploadPicture upload = new UploadPicture(this, mApi, PHOTO_DIR, file2, mImage); 
        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 DBRoulette 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). 
    */ 
    private void loadAuth(AndroidAuthSession session) { 
     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 || key.length() == 0 || secret.length() == 0) return; 

     if (key.equals("oauth2:")) { 
      // If the key is set to "oauth2:", then we can assume the token is for OAuth 2. 
      session.setOAuth2AccessToken(secret); 
     } else { 
      // Still support using old OAuth 1 tokens. 
      session.setAccessTokenPair(new AccessTokenPair(key, secret)); 
     } 
    } 

    /** 
    * 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 storeAuth(AndroidAuthSession session) { 
     // Store the OAuth 2 access token, if there is one. 
     String oauth2AccessToken = session.getOAuth2AccessToken(); 
     if (oauth2AccessToken != null) { 
      SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_NAME, 0); 
      Editor edit = prefs.edit(); 
      edit.putString(ACCESS_KEY_NAME, "oauth2:"); 
      edit.putString(ACCESS_SECRET_NAME, oauth2AccessToken); 
      edit.commit(); 
      return; 
     } 
     // Store the OAuth 1 access token, if there is one. This is only necessary if 
     // you're still using OAuth 1. 
     AccessTokenPair oauth1AccessToken = session.getAccessTokenPair(); 
     if (oauth1AccessToken != null) { 
      SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_NAME, 0); 
      Editor edit = prefs.edit(); 
      edit.putString(ACCESS_KEY_NAME, oauth1AccessToken.key); 
      edit.putString(ACCESS_SECRET_NAME, oauth1AccessToken.secret); 
      edit.commit(); 
      return; 
     } 
    } 

    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 = new AndroidAuthSession(appKeyPair); 
     loadAuth(session); 
     return session; 
    } 
} 

답변

관련 문제