从相机返回结果时也会调用 onCreate 方法

Posted

技术标签:

【中文标题】从相机返回结果时也会调用 onCreate 方法【英文标题】:onCreate method also called when returning result from camera 【发布时间】:2012-01-07 20:32:52 【问题描述】:

我正在制作一个可以从相机拍照并将其加载到 ImageView 中的应用程序。 现在我的问题是当我打开相机,拍照并返回我的应用程序时,然后 调用 onActivityResult 之后也会调用 onCreate 方法。

这个问题出现在三星的模型中。当我在 HTC Wildfire 上运行此代码时,一切正常。在 HTC Wildfire 中调用 onActivityResult 然后调用 onResume。所以我想要什么 在 HTC Wildfire 中可以实现,但在三星 S 中则不行。

这是我的代码,

protected void onActivityResult(int requestCode, int resultCode, Intent data) 

         Drawable drawable = null;
         System.out.println("Faces Fond"+facesFound);
         System.out.println("On Activity Result is called");
        switch (requestCode) 

        case Constants.PICK_IMAGE:
            switch(resultCode)
            
            case RESULT_CANCELED:
                break;
            case RESULT_OK:
                dragLayer.removeAllViews();
                isFaceDetected = false;
                resetArray();
                numberOfViews = 0;
                if(data!=null)
                 uriOfImage = data.getData();
                 System.out.println("Uri is "+ uriOfImage);
                 if(bitmapForDragLayer != null)
                 bitmapForDragLayer.recycle();
                    try 
                        bitmapForDragLayer = BitmapFactory.decodeStream(getContentResolver().openInputStream(uriOfImage));
                         bitmapForDragLayer = Bitmap.createScaledBitmap(bitmapForDragLayer, widthOfBitmap, heightOfBitmap, true);
                     catch (FileNotFoundException e) 
                        e.printStackTrace();
                    
                    catch(Exception e)
                        e.printStackTrace();
                    
                     drawable = new BitmapDrawable(bitmapForDragLayer);
                    dragLayer.setBackgroundDrawable(drawable);
                    isImageLoaded = false;
                    
                break;
            
                break;

        case Constants.TAKE_PICTURE_CODE:
            switch(resultCode)
            
            case RESULT_CANCELED:
                break;
            case RESULT_OK:
                dragLayer.removeAllViews();
                isFaceDetected = false;
                resetArray();
                numberOfViews = 0;
                System.out.println("Value of data"+data);
                if(data!=null)
                bitmapForDragLayer = (Bitmap)data.getExtras().get("data");
                 bitmapForDragLayer = Bitmap.createScaledBitmap(bitmapForDragLayer, widthOfBitmap, heightOfBitmap, true);
                  drawable = new BitmapDrawable(bitmapForDragLayer);
                 dragLayer.setBackgroundDrawable(drawable);
                 isImageLoaded = false;
                
                 break;
            
            break;

        case Constants.FRAME_SELECT_CODE:
            currentFrame = frameSelection.getFrameBitmap(resultCode);
            currentSelectedBitmapVO.setSelectedBitmap(selectedFrame);
            selectedFrame = currentFrame;
                    for(int i=0;i<array.size();i++)
                    
                        System.out.println("value of i"+i);
                        if(array.get(i))
                        
                        int height = currentBitmapVO[i].getSelectedBitmapHeight();
                        int width  = currentBitmapVO[i].getSelectedBitmapWidth();
                        Bitmap b = Bitmap.createScaledBitmap(currentFrame, width, height, true);
                        selectedFrame = b;
                        imageView[i].setImageBitmap(selectedFrame);
                        imageView[i].invalidate();
                        
                    
                break;
        
 

这里是调用Camera拍照的代码。

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, Constants.TAKE_PICTURE_CODE);

相同的代码在 HTC 中运行良好,但在三星中却不行。

【问题讨论】:

您的活动如何处理配置更改? 看看这篇文章:***.com/questions/4901752/… 我用一个丑陋的解决方法解决了关于额外调用 onCreate 函数的问题。 【参考方案1】:

可能你的应用在拍照时因为内存不足被系统杀掉了。然后活动生命周期将以onCreate()重新开始

【讨论】:

但是这段代码在 HTC Wildfire 中运行良好,它的处理器较低,而三星 S 的处理器比 HTC Wildfire 高。 查看logCat,发现onCreate和onResume调用了两次,onActivityResult调用了一次。顺序如下。 1.onCreate 2.onActivityResult 3.onResume 4.onCreate 5.onResume. @Pankit,我遇到了同样的问题。这就是你要找的东西:***.com/questions/10411009/…

以上是关于从相机返回结果时也会调用 onCreate 方法的主要内容,如果未能解决你的问题,请参考以下文章

关闭 TimePickerDialog 时也会调用 OnTimeSet

怎样实现android 返回到上一个Activity并重新执行一次onCreate方法

面向对象----方法的重载

使用安全凭据调用 SQL 命令

即使 IAM 角色具有完整的 Redshift 权限,AWS Lambda 在调用 Redshift 的“CreateCluster”操作时也会出现“拒绝访问”错误

从图库或相机返回后不调用 onActivityResult