android - 使用 Galaxy S4 在 onActivityResult 时应用程序崩溃

标签 android camera

我有一个拍摄照片的 Activity ,然后用拍摄的图像设置 ImageView ,然后上传它进行解析。 它在 LG G4 上工作得很好,但在我按下说我想要这张照片的按钮后,它在 Galaxy S4 上崩溃,它在 OnActivityResult 函数中崩溃。 我在日志中看到有一个空指针异常,我猜是因为 galaxy s4 的内存比 LG G4 少。 我想我理解这个问题(我对内存的假设),但不知道如何解决它。

Activity

import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.PersistableBundle;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import com.parse.FindCallback;
import com.parse.GetDataCallback;
import com.parse.ParseException;
import com.parse.ParseFile;
import com.parse.ParseObject;
import com.parse.ParseQuery;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

public class SituationStatusActivity extends AppCompatActivity {

    ImageView imVCature_pic_nir;
    ImageView imVCature_pic_sharon;

    private static final int REQUEST_CODE = 1;

    String imageFilePath;
    public SharedPreferences startExplePref;
    public String user;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_situation_status);
        if(savedInstanceState!=null){
            imageFilePath = savedInstanceState.getString("path");
        }
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        overridePendingTransition(R.anim.fadein, R.anim.fadeout);

//       get the user
        startExplePref = PreferenceManager.getDefaultSharedPreferences(this);
        user = startExplePref.getString("user", "");
//        upload nir Pic

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        imageFilePath = Environment.getExternalStorageDirectory().toString() + "/Android/data/com.my.app/Image-" + timeStamp + ".png";

        imVCature_pic_nir = (ImageView) findViewById(R.id.nirPic);
        imVCature_pic_sharon = (ImageView) findViewById(R.id.sharonPic);

        Button uploadPic = (Button) findViewById(R.id.picUploadButton);
        uploadPic.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {    /*************************** Camera Intent Start ************************/
                File imageFile = new File(imageFilePath);
                Uri imageFileUri = Uri.fromFile(imageFile); // convert path to Uri
                // Standard Intent action that can be sent to have the camera
                // application capture an image and return it.
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri);   // set the image file name
                startActivityForResult(intent, 1);
                /*************************** Camera Intent End ************************/
            }
        });

        UpdatePic();

    }

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        outState.putString("path", imageFilePath);

    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
// if picture was taken
        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {

            BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
            bmpFactoryOptions.inJustDecodeBounds = true;
            bmpFactoryOptions.inSampleSize = 5;
            bmpFactoryOptions.inJustDecodeBounds = false;

            //imageFilePath image path which you pass with intent
            Bitmap bp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);

            //rotate image by 90 degrees
            Matrix rotateMatrix = new Matrix();
            rotateMatrix.postRotate(90);
            Bitmap rotatedBitmap = Bitmap.createBitmap(bp, 0, 0, bp.getWidth(), bp.getHeight(), rotateMatrix, false);
//
            Drawable d = new BitmapDrawable(rotatedBitmap);

            ByteArrayOutputStream stream = new ByteArrayOutputStream();
//            // Compress image to lower quality scale 1 - 100
            rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
            byte[] image = stream.toByteArray();
//
//            // Create the ParseFile
            ParseFile file = new ParseFile("image.png", image);
//            // Upload the image into Parse Cloud
            file.saveInBackground();
//
//            // Create a New Class called "ImageUpload" in Parse
            ParseObject SituationPic = new ParseObject("SituationPic");
//
//            // Create a column named "ImageName" and set the string
            SituationPic.put("ImageName", "First Pic");
//
            SituationPic.put("user", user);

//            // Create a column named "ImageFile" and insert the image
            SituationPic.put("ImageFile", file);
//
//            // Create the class and the columns
            SituationPic.saveInBackground();

            if (user.equals("nir")) {
                imVCature_pic_nir.setImageBitmap(getRoundedCornerBitmap(rotatedBitmap, 500));
                imVCature_pic_nir.setScaleType(ImageView.ScaleType.FIT_XY);

            } else if (user.equals("sharon")) {
                imVCature_pic_sharon.setImageBitmap(getRoundedCornerBitmap(rotatedBitmap, 500));
                imVCature_pic_sharon.setScaleType(ImageView.ScaleType.FIT_XY);

            } else {
                Toast.makeText(SituationStatusActivity.this, "error", Toast.LENGTH_LONG).show();
            }

//       if picture was not taken
        } else {
            Toast.makeText(getApplicationContext(), "not taken", Toast.LENGTH_LONG).show();
        }
//        UpdatePic();
    }


    public Bitmap nirBitmap;
    public Bitmap sharonBitmap;
    //change it to load in the beginiing
    public void UpdatePic()
    {
//        Update photo of nir
        ParseQuery<ParseObject> querynir = ParseQuery.getQuery("SituationPic");
        querynir.orderByDescending("updatedAt");
        querynir.whereEqualTo("user", "nir");
        querynir.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(List<ParseObject> objects, ParseException e) {
                ParseObject object = objects.get(0);
                ParseFile applicantResume = (ParseFile) object.get("ImageFile");
                applicantResume.getDataInBackground(new GetDataCallback() {
                    public void done(byte[] data, ParseException e) {
                        if (e == null) {
                            Bitmap bmp = BitmapFactory.decodeByteArray(data, 0,
                                    data.length);
                            Matrix rotateMatrix = new Matrix();
                            rotateMatrix.postRotate(360);
                            Bitmap rotatedBitmap = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), rotateMatrix, false);
                            nirBitmap = rotatedBitmap;
                            imVCature_pic_nir.setImageBitmap(getRoundedCornerBitmap(rotatedBitmap, 500));
                            imVCature_pic_nir.setScaleType(ImageView.ScaleType.FIT_XY);
                        }
                    }
                });
            }
        });

        //        Update photo of sharon
        ParseQuery<ParseObject> querySHN = ParseQuery.getQuery("SituationPic");
        querySHN.orderByDescending("updatedAt");
        querySHN.whereEqualTo("user", "sharon");
        querySHN.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(List<ParseObject> objects, ParseException e) {
                ParseObject object = objects.get(0);

                ParseFile applicantResume = (ParseFile) object.get("ImageFile");
                applicantResume.getDataInBackground(new GetDataCallback() {
                    public void done(byte[] data, ParseException e) {
                        if (e == null) {
                            Bitmap bmp = BitmapFactory.decodeByteArray(data, 0,
                                    data.length);
                            Matrix rotateMatrix = new Matrix();
                            rotateMatrix.postRotate(180);
                            Bitmap rotatedBitmap = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), rotateMatrix, false);

                            sharonBitmap = rotatedBitmap;


                            imVCature_pic_sharon.setImageBitmap(getRoundedCornerBitmap(rotatedBitmap, 500));
                            imVCature_pic_sharon.setScaleType(ImageView.ScaleType.FIT_XY);
                        }
                    }
                });
            }
        });

    }

    public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) {
        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
                .getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        final RectF rectF = new RectF(rect);
        final float roundPx = pixels;

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);

        return output;
    }


}

日志猫

FATAL EXCEPTION: main
                                                                               Process: fastner.israel.nir_zabari.onelove, PID: 31324
                                                                               java.lang.RuntimeException: Unable to resume activity {fastner.israel.nir_zabari.onelove/fastner.israel.nir_zabari.onelove.SituationStatusActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {fastner.israel.nir_zabari.onelove/fastner.israel.nir_zabari.onelove.SituationStatusActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
                                                                                   at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3394)
                                                                                   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3425)
                                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2763)
                                                                                   at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4462)
                                                                                   at android.app.ActivityThread.access$1000(ActivityThread.java:177)
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1454)
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                   at android.os.Looper.loop(Looper.java:145)
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5942)
                                                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                                                   at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
                                                                                Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {fastner.israel.nir_zabari.onelove/fastner.israel.nir_zabari.onelove.SituationStatusActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
                                                                                   at android.app.ActivityThread.deliverResults(ActivityThread.java:4058)                                                                                    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3380)
                                                                                   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3425) 
                                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2763) 
                                                                                   at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4462) 
                                                                                   at android.app.ActivityThread.access$1000(ActivityThread.java:177) 
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1454) 
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                   at android.os.Looper.loop(Looper.java:145) 
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5942) 
                                                                                   at java.lang.reflect.Method.invoke(Native Method) 
                                                                                   at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) 
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 
                                                                                Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
                                                                                   at fastner.israel.nir_zabari.onelove.SituationStatusActivity.onActivityResult(SituationStatusActivity.java:117)
                                                                                   at android.app.Activity.dispatchActivityResult(Activity.java:6549)
                                                                                   at android.app.ActivityThread.deliverResults(ActivityThread.java:4054)
                                                                                   at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3380) 
                                                                                   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3425) 
                                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2763) 
                                                                                   at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4462) 
                                                                                   at android.app.ActivityThread.access$1000(ActivityThread.java:177) 
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1454) 
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                   at android.os.Looper.loop(Looper.java:145) 
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5942) 
                                                                                   at java.lang.reflect.Method.invoke(Native Method) 
                                                                                   at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) 
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 

最佳答案

在对已解码的位图进行任何操作之前,您需要检查它实际上是否已正确解码。

// Code above
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
    BitmapFactory.Options bmpFactoryOptions = new mapFactory.Options();
    bmpFactoryOptions.inJustDecodeBounds = true;
    bmpFactoryOptions.inSampleSize = 5;
    bmpFactoryOptions.inJustDecodeBounds = false;

    //imageFilePath image path which you pass with intent
    Bitmap bp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
    if (bp != null) {
        //rotate image by 90 degrees
        Matrix rotateMatrix = new Matrix();
        rotateMatrix.postRotate(90);
        Bitmap rotatedBitmap = Bitmap.createBitmap(bp, 0, 0, bp.getWidth(), bp.getHeight(), rotateMatrix, false);
    }
// Code below

关于android - 使用 Galaxy S4 在 onActivityResult 时应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34830313/

相关文章:

java - 将整数日期/时间转换为 Java 中的 unix 时间戳?

android - 从 Android 库项目覆盖 Activity

Android Webview 相机上传无法旋转?网页 View 重新加载?安卓 5 和 6+

java - 在java应用程序中使用黑莓相机选择已存档的照片

c# - 统一: Camera is jumpy/jerky when using touch grab to move rotation

android - 为我的 Android 设备删除 Settings.APK 会有什么影响?

android - 在 CollapsingToolbarLayout 中设置 minHeight 没有任何效果

Android:如何更改 ListView 中一项的颜色?

ios - 修复自定义相机应用程序 iOS 的方向

python - 以指定的时间间隔录制视频,然后将其保存到OpenCv Python文件中