Android 点击“上传图片”后,从gallery功能中选择图片,并在imageView中显示图片

Android 点击“上传图片”后,从gallery功能中选择图片,并在imageView中显示图片,android,image,android-intent,bitmapimage,android-external-storage,Android,Image,Android Intent,Bitmapimage,Android External Storage,我想允许用户在点击“上传图片”按钮后从图库中选择图片,但我的代码似乎无法正常工作。该应用程序在用户选择所需图片后立即崩溃 这是我在MainActivity中创建OnCreate的代码: public static final int RESULT_LOAD_IMAGE = 100; private final int PICK_IMAGE = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.

我想允许用户在点击“上传图片”按钮后从图库中选择图片,但我的代码似乎无法正常工作。该应用程序在用户选择所需图片后立即崩溃

这是我在MainActivity中创建OnCreate的代码:

public static final int RESULT_LOAD_IMAGE = 100;
private final int PICK_IMAGE = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

faceServiceClient = new FaceServiceRestClient("INSERT ENDPOINT HERE", 
"INSERT API KEY HERE");

    takePicture = findViewById(R.id.takePic);
    imageView = findViewById(R.id.imageView);
    hidden = findViewById(R.id.hidden);
    imageView.setVisibility(View.INVISIBLE);
    uploadPicture = findViewById(R.id.uploadPic);
    process = findViewById(R.id.processClick);


    takePicture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
            } else {
                //IMPORTANT: You may notice that the pictures from the camera are low quality.
                //TO FIX THIS: You need to request permission to write external storage that way you can access the full-quality image
                //from the device, rather than a low quality thumbnail.
                if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        == PackageManager.PERMISSION_GRANTED) {
                    values = new ContentValues();
                    values.put(MediaStore.Images.Media.TITLE, "New Picture");
                    values.put(MediaStore.Images.Media.DESCRIPTION, "From your Camera");
                    imageUri = getContentResolver().insert(
                            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                    startActivityForResult(intent, 100);
                } else {
                    if (counter == 2 || (counter > 2 && counter % 2 == 0)) {
                        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        startActivityForResult(intent, 1);
                    } else                         //Requesting storage permissions so we can get a high quality image.
                        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
                    counter++;
                    
                }
            }
        }
    });

    uploadPicture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("image/*");
            startActivityForResult(Intent.createChooser(
                    intent, "Select Picture"), PICK_IMAGE);
        }


    });

    process.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (ready) {
                detectandFrame(mBitmap);
            } else {
                makeToast("Please take a picture.");
            }
        }
    });
   
}
Uri imageUri;
ContentValues values;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 100) { //High Quality picture using URI and storage
        if (resultCode == RESULT_OK) {
            imageView.setVisibility(View.VISIBLE);
            try {
                mBitmap = MediaStore.Images.Media.getBitmap(
                        getContentResolver(), imageUri);

                Bitmap rotatedBitmap = mBitmap;
                ExifInterface ei = new ExifInterface(getRealPathFromURI(imageUri));
                int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                        ExifInterface.ORIENTATION_UNDEFINED);

                switch (orientation) {

                    case ExifInterface.ORIENTATION_ROTATE_90:
                        rotatedBitmap = rotateImage(mBitmap, 90);
                        break;

                    case ExifInterface.ORIENTATION_ROTATE_180:
                        rotatedBitmap = rotateImage(mBitmap, 180);
                        break;

                    case ExifInterface.ORIENTATION_ROTATE_270:
                        rotatedBitmap = rotateImage(mBitmap, 270);
                        break;

                    case ExifInterface.ORIENTATION_NORMAL:
                    default:
                        rotatedBitmap = mBitmap;
                }
                imageView.setImageBitmap(rotatedBitmap);

            } catch (IOException e) {
                //Error getting high quality image --> Use low quality thumbnail.
                makeToast("Error: " + e.toString());
                //mBitmap = (Bitmap) data.getExtras().get("data");
                e.printStackTrace();
                imageView.setImageBitmap(mBitmap);
            }
            ready = true;
            hidden.setVisibility(View.INVISIBLE);
        }
    }else if(requestCode == 1 && resultCode == RESULT_OK){
        //Low Quality image
        imageView.setVisibility(View.VISIBLE);
        mBitmap = (Bitmap) data.getExtras().get("data");
        imageView.setImageBitmap(mBitmap);
        ready = true;
        hidden.setVisibility(View.INVISIBLE);
    }

    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]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();

    }

    if (requestCode == PICK_IMAGE && resultCode == RESULT_OK &&
            data != null && data.getData() != null) {
        Uri uri = data.getData();
        try {
            imageView.setVisibility(View.VISIBLE);
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(
                    getContentResolver(), uri);
            ImageView imageView = findViewById(R.id.imageView);
            imageView.setImageBitmap(bitmap);
            ready = true;
            hidden.setVisibility(View.INVISIBLE);
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public String getRealPathFromURI(Uri uri) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    return cursor.getString(idx);
}

public static Bitmap rotateImage(Bitmap source, float angle) {
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(),
            matrix, true);
}

}
这是我在MainActivity中的onActivityResult:

public static final int RESULT_LOAD_IMAGE = 100;
private final int PICK_IMAGE = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

faceServiceClient = new FaceServiceRestClient("INSERT ENDPOINT HERE", 
"INSERT API KEY HERE");

    takePicture = findViewById(R.id.takePic);
    imageView = findViewById(R.id.imageView);
    hidden = findViewById(R.id.hidden);
    imageView.setVisibility(View.INVISIBLE);
    uploadPicture = findViewById(R.id.uploadPic);
    process = findViewById(R.id.processClick);


    takePicture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
            } else {
                //IMPORTANT: You may notice that the pictures from the camera are low quality.
                //TO FIX THIS: You need to request permission to write external storage that way you can access the full-quality image
                //from the device, rather than a low quality thumbnail.
                if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        == PackageManager.PERMISSION_GRANTED) {
                    values = new ContentValues();
                    values.put(MediaStore.Images.Media.TITLE, "New Picture");
                    values.put(MediaStore.Images.Media.DESCRIPTION, "From your Camera");
                    imageUri = getContentResolver().insert(
                            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                    startActivityForResult(intent, 100);
                } else {
                    if (counter == 2 || (counter > 2 && counter % 2 == 0)) {
                        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        startActivityForResult(intent, 1);
                    } else                         //Requesting storage permissions so we can get a high quality image.
                        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
                    counter++;
                    
                }
            }
        }
    });

    uploadPicture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("image/*");
            startActivityForResult(Intent.createChooser(
                    intent, "Select Picture"), PICK_IMAGE);
        }


    });

    process.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (ready) {
                detectandFrame(mBitmap);
            } else {
                makeToast("Please take a picture.");
            }
        }
    });
   
}
Uri imageUri;
ContentValues values;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 100) { //High Quality picture using URI and storage
        if (resultCode == RESULT_OK) {
            imageView.setVisibility(View.VISIBLE);
            try {
                mBitmap = MediaStore.Images.Media.getBitmap(
                        getContentResolver(), imageUri);

                Bitmap rotatedBitmap = mBitmap;
                ExifInterface ei = new ExifInterface(getRealPathFromURI(imageUri));
                int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                        ExifInterface.ORIENTATION_UNDEFINED);

                switch (orientation) {

                    case ExifInterface.ORIENTATION_ROTATE_90:
                        rotatedBitmap = rotateImage(mBitmap, 90);
                        break;

                    case ExifInterface.ORIENTATION_ROTATE_180:
                        rotatedBitmap = rotateImage(mBitmap, 180);
                        break;

                    case ExifInterface.ORIENTATION_ROTATE_270:
                        rotatedBitmap = rotateImage(mBitmap, 270);
                        break;

                    case ExifInterface.ORIENTATION_NORMAL:
                    default:
                        rotatedBitmap = mBitmap;
                }
                imageView.setImageBitmap(rotatedBitmap);

            } catch (IOException e) {
                //Error getting high quality image --> Use low quality thumbnail.
                makeToast("Error: " + e.toString());
                //mBitmap = (Bitmap) data.getExtras().get("data");
                e.printStackTrace();
                imageView.setImageBitmap(mBitmap);
            }
            ready = true;
            hidden.setVisibility(View.INVISIBLE);
        }
    }else if(requestCode == 1 && resultCode == RESULT_OK){
        //Low Quality image
        imageView.setVisibility(View.VISIBLE);
        mBitmap = (Bitmap) data.getExtras().get("data");
        imageView.setImageBitmap(mBitmap);
        ready = true;
        hidden.setVisibility(View.INVISIBLE);
    }

    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]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();

    }

    if (requestCode == PICK_IMAGE && resultCode == RESULT_OK &&
            data != null && data.getData() != null) {
        Uri uri = data.getData();
        try {
            imageView.setVisibility(View.VISIBLE);
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(
                    getContentResolver(), uri);
            ImageView imageView = findViewById(R.id.imageView);
            imageView.setImageBitmap(bitmap);
            ready = true;
            hidden.setVisibility(View.INVISIBLE);
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public String getRealPathFromURI(Uri uri) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    return cursor.getString(idx);
}

public static Bitmap rotateImage(Bitmap source, float angle) {
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(),
            matrix, true);
}

}
这是我的AndroidManifest.xml代码。我意识到,当我在清单中包含WRITE_EXTERNAL_存储时,我的相机拍照功能在点击“处理”按钮后无法工作。它将显示“检测”相当长一段时间,然后崩溃。因此,结果将不会显示。但是,在我删除清单中的WRITE_外部_存储之后,它可以很好地显示结果。但在用户选择一张图片后,gallery中的选择仍然崩溃

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.anany.emotionrecognition">

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>

<application
    android:allowBackup="true"
    android:icon="@drawable/smiling"
    android:label="@string/app_name"
    android:roundIcon="@drawable/smiling"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <uses-library android:name="org.apache.http.legacy" android:required="false" />

    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".ResultActivity"></activity>
</application>
更改uploadpicture onclicklistner代码

uploadPicture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            imageFile = getDefaultFileName(MainActivity.this);
            Intent i = new Intent(Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(i, PICK_IMAGE);
        }

 public File getDefaultFileName(Context context) {
        File imageFile1;
        Boolean isSDPresent = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
        if (isSDPresent) { // External storage path
            imageFile1 = new File(Environment.getExternalStorageDirectory() + File.separator + "abc" + System.currentTimeMillis() + ".png");
        } else {  // Internal storage path
            imageFile1 = new File(context.getFilesDir() + File.separator + "abc" + System.currentTimeMillis() + ".png");
        }
        return imageFile1;
    }
我的最新活动结果基于您的回答

Uri imageUri;
ContentValues values;

@RequiresApi(api = Build.VERSION_CODES.N)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == Activity.RESULT_OK) {
        imageView.setVisibility(View.VISIBLE);
        switch (requestCode) {
            case PICK_IMAGE:
                try {
                    InputStream inputStream =
                            getContentResolver().openInputStream(data.getData());
                    FileOutputStream fileOutputStream = new FileOutputStream(imageFile);
                    copyStream(inputStream, fileOutputStream);
                    fileOutputStream.close();
                    if (inputStream != null)
                        inputStream.close();
                    String imagePath = Uri.fromFile(imageFile).getPath();

                    // Here Add you image load code
                  //  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);
                        
                   // }
                    Toast.makeText(MainActivity.this, imagePath, Toast.LENGTH_SHORT).show();
imageView.setImageBitmap(BitmapFactory.decodeFile(imagePath));
                    } catch (Exception e) {
                        e.printStackTrace();

                    }
                ready = true;
                hidden.setVisibility(View.INVISIBLE);
                break;
            default:
                break;
        }
    }
}

private void copyStream(InputStream input, FileOutputStream output) throws IOException {
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = input.read(buffer)) != -1) {
            output.write(buffer, 0, bytesRead);
        }
    }
改为:

InputStream is = getContentResolver().openInputStream(data.getData());

ExifInterFace ei = new ExifInterFace(is);

该应用程序在用户选择所需图片后立即崩溃。那将是在onActivityResult中。你发布了太多的代码。仅此功能和使用意图就足够了。发布日志猫,而不是所有不相关的代码。原因:java.lang.NullPointerException:尝试在com.example.anany.emotionrecognition.MainActivity.onActivityResultMainActivity.java:216上的空对象引用上调用虚拟方法“java.lang.Object android.os.Bundle.getjava.lang.String”?第216行的内容仍然太多该函数将返回null。不要使用这样糟糕的函数。@blackapps MainActivity.java:216是mBitmap=Bitmap data.getExtras.getdata;它位于}else ifrequestCode==1&&resultCode==RESULT\u OK{中,与您的代码一样,但在拾取照片后仍然崩溃。错误日志仍然位于mBitmap=Bitmap data.getExtras.getdata;在}else if requestCode==1&&resultCode==RESULT\u OK中{你的文章代码太多,把我和你的文章搞混了。请检查更新的评论,并启动活动顶部的imageFile。选择图片并加载效果很好,但所选图片未设置为imageview,因此现在它确实显示为空。如何将其设置为imageview?从我的代码中可以看出,我有两个imageview一个是可见的,另一个是隐藏的。我尝试在中断之前放置imageView行,但似乎没有任何效果,我不确定imageView中应该设置什么图像,是mBitmap吗?它仍然不起作用@Deep Parsania我想是因为setVisibility,但在我放置代码imageView.setVisibilityView.visible;ready=true;hidden.setVisibilityView.INVISIBLE;它仍然不起作用检查您的评论@Deep Parsania。我已使用最新的onActivityResultupdated评论进行了更新。我已将toast消息添加到您的图像路径中。请检查toast消息中显示的内容