【问题标题】:exception when selecting image from gallery从图库中选择图像时出现异常
【发布时间】:2014-04-24 12:05:12
【问题描述】:

我正在尝试浏览图库中的图片。但我得到以下运行时异常

04-24 08:00:11.787: E/AndroidRuntime(1546): 致命异常: main 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.ActivityThread.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(Native Method) 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(Native Method) 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(1546): 在 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: E/AndroidRuntime(1546): ... 11 更多

代码是

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

【问题讨论】:

    标签: android


    【解决方案1】:

    【讨论】:

    • 我不知道你的代码。您必须检查,为什么 mCameraFileName 为空并修复它。
    • 当我尝试浏览图库时出现异常。 mCameraFileName 根本不会出现在该段中。当我单击图片时使用它,然后它可以完美运行。我已将代码作为画廊意图的 REQUEST_LOAD_IMAGE 给出。所以它去了 else 部分。
    • 我已经发布了整个代码。有人请告诉我为什么当我尝试浏览图库中的图片时我的应用程序崩溃
    猜你喜欢
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 2013-06-29
    • 1970-01-01
    • 2023-04-06
    • 2021-07-08
    • 1970-01-01
    相关资源
    最近更新 更多