【问题标题】:App is crashing after capturing picture using intents使用意图捕获图片后应用程序崩溃
【发布时间】:2016-09-09 11:11:58
【问题描述】:

使用 intents.log cat 捕获 5 到 6 张照片后,我的应用程序崩溃了。我无法找到它崩溃的原因。请帮帮我。

    private void capturePhoto() {

        File root = new File(Environment.getExternalStorageDirectory(), "Feedback");
        if (!root.exists()) {
            root.mkdirs();
        }
        File file = new File(root, Constants.PROFILE_IMAGE_NAME + ".jpeg");
        Uri outputFileUri = Uri.fromFile(file);


        Intent photoPickerIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        photoPickerIntent.putExtra("return-data", true);
        photoPickerIntent.putExtra("android.intent.extras.CAMERA_FACING", 1);
        startActivityForResult(photoPickerIntent, requestCode);


    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (this.requestCode == requestCode && resultCode == RESULT_OK) {

            File root = new File(Environment.getExternalStorageDirectory(), "Feedback");
            if (!root.exists()) {
                root.mkdirs();
            }
            File file = new File(root, Constants.PROFILE_IMAGE_NAME+".jpeg");
            checkFlowIdisPresent(file);

            displayPic();


        }
    }
  private void displayPic() {

        String filePath = Environment.getExternalStorageDirectory()
                .getAbsolutePath() + File.separator + "/Feedback/" + Constants.PROFILE_IMAGE_NAME + ".jpeg";
        //  Bitmap bmp = BitmapFactory.decodeFile(filePath);
        //Bitmap scaled = Bitmap.createScaledBitmap(bmp, 300, 300, true);


        File imgFile = new File(filePath);
        Bitmap bmp = decodeFile(imgFile);

        if (imgFile.exists()) {

            dispProfilePic.setImageBitmap(bmp);
        } else {
            dispProfilePic.setBackgroundResource(R.drawable.user_image);

        }
    }

 private Bitmap decodeFile(File f) {
        try {
            // Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f), null, o);

            // The new size we want to scale to
            final int REQUIRED_SIZE = 70;

            // Find the correct scale value. It should be the power of 2.
            int scale = 1;
            while (o.outWidth / scale / 2 >= REQUIRED_SIZE &&
                    o.outHeight / scale / 2 >= REQUIRED_SIZE) {
                scale *= 2;
            }

            // Decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        } catch (FileNotFoundException e) {
        }
        return null;
    }

以上代码用于拍摄照片并在 ImageView 中显示拍摄的图片。并且正在使用 MI 选项卡。

编辑实际上应用程序没有崩溃......它变成白屏,如果我按下任何按钮,它就会崩溃并且当它变成白屏时不会执行 onActivityResult

新编辑我能够复制这个。我点击了Android Monitor,因为我点击了Monitor。然后它显示我与应用程序交互时应用程序的内存利用率。现在在左侧栏中,我单击了终止应用程序图标。现在有趣的是它破坏了当前的活动并转移到以前的活动。之前的活动变成了白屏。

请帮帮我。

【问题讨论】:

  • 您能发布崩溃日志吗?啊日志猫什么也没显示..
  • 它什么也没显示。并且很难复制它
  • 它必须显示一些东西。一旦您设法复制它,请在此处发布它,因为没有它,几乎不可能帮助您:/
  • 您是否在清单文件中声明了权限,例如写入外部存储和摄像头
  • @NarenderReddy 没有权限它会在第一次崩溃

标签: android


【解决方案1】:

试试这个代码。我在我的一些应用中使用它:

启动意图方法:

private void launchCamera() {
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
    }

捕获结果:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        try {
            if (requestCode == CAMERA_PIC_REQUEST) {
                if (data != null) {
                    Bundle extras = data.getExtras();
                    if (extras != null) {
                        Bitmap thumbnail = (Bitmap) extras.get("data");
                        if (thumbnail != null)
                            displayPic(thumbnail);
                    }
                }
            }
            } catch (Exception e) {
            e.printStackTrace();
            }
    }

【讨论】:

    【解决方案2】:

    你的代码很好......

    我认为您将图像保存在同名的相同路径上或覆盖图像,因此内存存在问题。所以我建议你用System.currentTimeMillis() 或任何随机名称来更改名称,而不是Constants.PROFILE_IMAGE_NAME

    还要检查权限

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    

    还要在运行时检查此权限...对于运行时间,请关注this

    private static final int REQUEST_RUNTIME_PERMISSION = 123;
    
    
        if (CheckPermission(demo.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
    
    
            capturePhoto();
    
        } else {
            // you do not have permission go request runtime permissions
            RequestPermission(demo.this, Manifest.permission.WRITE_EXTERNAL_STORAGE, REQUEST_RUNTIME_PERMISSION);
        }
    
    
    
    public void RequestPermission(Activity thisActivity, String Permission, int Code) {
            if (ContextCompat.checkSelfPermission(thisActivity,
                    Permission)
                    != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                        Permission)) {
                    capturePhoto();
    
                } else {
                    ActivityCompat.requestPermissions(thisActivity,
                            new String[]{Permission},
                            Code);
                }
            }
        }
    
        public boolean CheckPermission(Activity context, String Permission) {
            if (ContextCompat.checkSelfPermission(context,
                    Permission) == PackageManager.PERMISSION_GRANTED) {
                return true;
            } else {
                return false;
            }
        }
    

    【讨论】:

    • Constants.PROFILE_IMAGE_NAME 是随机流 id
    【解决方案3】:

    如果log cat上什么都没有显示,那么很难推测,但是请检查问题是否是在使用模拟器时而不是在真实设备上。您也可以检查是否可以通过减小仿真器容量(Ram 和内部存储器)来重现问题。如果是这种情况,请增加模拟器的内存或内存,它应该可以正常工作。然后,您需要针对低规格设备优化图像处理任务。

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      发生这种情况可能是因为 Calling Activity 被操作系统杀死然后重新启动,因为 IMAGE CAPTURE 意图处理 大量内存 以处理通过 CAMERA 捕获的 BITMAP。

      解决方案:保存Image的文件路径,在调用onActivityResult时使用。您可以使用 onSavedInstanceStateonRestoreInstanceState 方法来保存和检索 IMAGE_PATH 和 Activity 的其他字段。

      你可以参考这个链接how to use onSavedInstanceState and onRestoreInstanceState

      【讨论】:

        【解决方案5】:

        尝试在异步任务中执行此操作,因为您面临的问题是由于在 UI 线程中完成的拥抱处理

        请参阅here 以获取有关异步任务实施的更多帮助

        【讨论】:

          【解决方案6】:

          这可能是您正在拍摄照片并将它们存储在位图中的内存问题 检查您的 android 监视器以检测应用程序的内存 只需将此方法设为静态

          private static Bitmap decodeFile(File f) {
                  try {
                      // Decode image size
                      BitmapFactory.Options o = new BitmapFactory.Options();
                      o.inJustDecodeBounds = true;
                      BitmapFactory.decodeStream(new FileInputStream(f), null, o);
          
                      // The new size we want to scale to
                      final int REQUIRED_SIZE = 70;
          
                      // Find the correct scale value. It should be the power of 2.
                      int scale = 1;
                      while (o.outWidth / scale / 2 >= REQUIRED_SIZE &&
                              o.outHeight / scale / 2 >= REQUIRED_SIZE) {
                          scale *= 2;
                      }
          
                      // Decode with inSampleSize
                      BitmapFactory.Options o2 = new BitmapFactory.Options();
                      o2.inSampleSize = scale;
                      return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
                  } catch (FileNotFoundException e) {
                  }
                  return null;
              }
          

          以不同的名称保存文件,例如以时间戳作为名称保存

          【讨论】:

            【解决方案7】:

            尝试使用下面的代码。对我来说效果很好。

             private static final int REQUEST_CAMERA = 1;
            
             @Override
             protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
            
                if (resultCode == RESULT_OK)
                {
                    if (requestCode == REQUEST_CAMERA)
                    {
                        Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
                        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
                        thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bytes);
            
                        File destination = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");
            
                        FileOutputStream fos;
            
                        try
                        {
                            destination.createNewFile();
                            fos = new FileOutputStream(destination);
                            fos.write(bytes.toByteArray());
                            fos.close();
                        }
                        catch (FileNotFoundException fnfe)
                        {
                            fnfe.printStackTrace();
                        }
                        catch (IOException ioe)
                        {
                            ioe.printStackTrace();
                        }
                        ivSetImage.setImageBitmap(thumbnail);
            
                    }
               }
            }
            

            在给定的代码 sn-p 中,我已经压缩了捕获的图像,因此解决了应用程序崩溃问题。

            在您的情况下,捕获的图像质量可能很高,因为您的应用在 ImageView 上设置图像时崩溃。

            只需尝试压缩图像。它会起作用的!

            不要忘记在清单文件中添加权限。

            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
            

            【讨论】:

              【解决方案8】:

              检查您的 Manifast.xml 文件权限 外部存储

              和相机权限。

              <uses-permission android:name="android.permission.CAMERA" />    
              <uses-feature android:name="android.hardware.camera" />  <uses-feature
              android:name="android.hardware.camera.autofocus" />
              

              如果您的应用在 Marshenter code heremallow 上运行,请检查运行时权限

              【讨论】:

                【解决方案9】:

                尝试使用以下代码:

                private void launchCamera() {
                    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
                }
                @Override
                public void onActivityResult(int requestCode, int resultCode, Intent data) {
                    super.onActivityResult(requestCode, resultCode, data);
                    try {
                        if (requestCode == CAMERA_PIC_REQUEST) {
                            if (data != null) {
                                Bundle extras = data.getExtras();
                                if (extras != null) {
                                    Bitmap thumbnail = (Bitmap) extras.get("data");
                                    if (thumbnail != null)
                                        displayPic(thumbnail);
                                }
                            }
                        }
                        } catch (Exception e) {
                        e.printStackTrace();
                        }
                }
                

                【讨论】:

                • 请不要发布与您的答案无关的链接!
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多