在返回onActivityResult

时间:2016-09-05 12:05:18

标签: android android-intent crash android-camera intermittent

我的应用使用MediaStore.ACTION_IMAGE_CAPTURE Intent拍照。问题是,在我按下快门按钮之后但在" OK"之前,应用程序间歇性地崩溃了。和"取消"显示允许我重新拍摄或接受照片的按钮。 Ok和Cancel按钮选择是intent的一部分而不是我的代码,因此崩溃似乎不是由我的代码直接引起的。

应用程序刚关闭并且没有显示错误消息,logcat没有做出反应,并且cpu /网络/内存监视器突然停止并说“#34;监视器被禁用"。

private void dispatchTakePictureIntent() {

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, getPhotoFileUri(photoFileName));

    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
    }
}

photoFileName始终为file:///storage/emulated/0/Android/data/com.companyname.appname/files/Pictures/AppName/myphoto.jpg

拍摄照片后,将由此代码处理

private List<Bitmap> myImages;
enter code here
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (resultCode != RESULT_CANCELED) {

        if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {

            if (resultCode == RESULT_OK) {
                Uri takenPhotoUri = getPhotoFileUri(photoFileName);
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 4;
                Bitmap takenImage = BitmapFactory.decodeFile(takenPhotoUri.getPath(), options);

                //Store image in memory
                myImages.add(takenImage);

                if (myImagesAdapter == null) {
                    myImagesAdapter = new MyImagesListViewAdapter(this, myImages);

                    GridView myListView = (GridView) findViewById(R.id.my_images_view);
                    myListView.setAdapter(myImagesAdapter);
                    myImagesAdapter.notifyDataSetChanged();
                } else {
                    myImagesAdapter.notifyDataSetChanged();
                }

            } else { // Result was a failure
                Toast.makeText(this, "Picture wasn't taken!", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

另外看起来这种情况经常发生/仅在调试模式下(按下android studio中的错误)而不是在我运行它时(按下播放按钮)。

这是在拍摄第一张照片时发生的,但也发生在第二张,第三张和第四张照片上。

更新1 当我将logcat更改为ha No Filters时,我得到这些行

  

09-06 22:30:26.961 990-1473 /? I / WindowState:WIN DEATH:Window {296d6791 u0 com.mycompany.myapp / com.mycompany.myapp.MyFirstActivity}

     

09-06 22:30:26.965 990-1473 /? D / InputDispatcher:Window消失了:Window {296d6791 u0 com.mycompany.myapp / com.mycompany.myapp.MyFirstActivity}

     

09-06 22:30:26.968 990-2174 /? I / WindowState:WIN DEATH:Window {3ac0ee0b u0 com.mycompany.myapp / com.mycompany.myapp.MySecondActivity}

     

09-06 22:30:26.971 990-2174 /? D / InputDispatcher:Window消失了:Window {3ac0ee0b u0 com.mycompany.myapp / com.mycompany.myapp.MySecondActivity}

     

09-06 22:30:27.059 990-1819 /? I / ActivityManager:进程com.mycompany.myapp(pid 8623)已经死亡

     

09-06 22:30:27.626 990-2174 /? I / ActivityManager:强制停止com.mycompany.myapp appid = 10170 user = 0:from pid 9949

     

09-06 22:30:27.627 990-2174 /? I / ActivityManager:强制完成活动ActivityRecord {18ca1aa0 u0 com.mycompany.myapp / .MyFirstActivity t254}

     

09-06 22:30:27.631 990-2174 /? I / ActivityManager:强制完成活动ActivityRecord {15946ece u0 com.mycompany.myapp / .MySecondActivity t254}

     

09-06 22:30:27.666 2249-2249 /? W / NearbyMessages:ClientAppContext:0P标识符(com.mycompany.myapp),没有0P前缀(0p:)

2 个答案:

答案 0 :(得分:0)

如果我删除任何具有相同名称的预先存在的文件,那么问题似乎不那么频繁(没有补救),所以我将第一个方法更改为

private void dispatchTakePictureIntent() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    Uri filename = getPhotoFileUri(photoFileName);

    File imageFile = new File(filename.getPath());
    if (imageFile.exists()) {
        imageFile.delete();
    }

    intent.putExtra(MediaStore.EXTRA_OUTPUT, filename);

    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
    }
}

的第二种方法
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    ...
                Bitmap takenImage = BitmapFactory.decodeFile(takenPhotoUri.getPath(), options);

                File imageFile = new File(takenPhotoUri.getPath());
                if (imageFile.exists()) {
                    imageFile.delete();
                }

                myImages.add(takenImage);
    ...

答案 1 :(得分:0)

不知何故,这只发生在调试模式下。使用&#34;运行&#39;&#39;&#34;它永远不会崩溃。不知道为什么会这样。

在logcat中,如果我过滤到所选应用程序(详细),我得到第一行,然后是下一行的几行

  

10-07 13:54:48.538 16352-16352 / com.fujitsu.helgaclient W / ContextImpl:无法确保目录:/storage/external_SD/Android/data/com.fujitsu.helgaclient/files/Pictures
  10-07 13:54:50.282 16352-16352 / com.fujitsu.helgaclient D / BubblePopupHelper:isShowingBubblePopup:false

当我启动相机意图然后什么都没有时,我就会知道这些。因此,当我按下快门和应用程序崩溃时,logcat对当前应用程序没有显示任何内容。如果我删除了过滤器,那么就会记录下来,因此无法在崩溃的同时找到发出的行。