2013-12-11 27 views
0
private File getOutputPhotoFile() { 
    File directory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), getPackageName()); 
    if (!directory.exists()) 
    { 
     if (!directory.mkdirs()) 
     { 
      responsetxt.setText("Failed to create directory"); 
      Log.e(TAG, "Failed to create storage directory."); 
      return null; 
     } 
    } 
    String timeStamp = new SimpleDateFormat("yyyMMdd_HHmmss", Locale.UK).format(new Date()); 
    //responsetxt.setText(directory.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); 
    return new File(directory.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); 
    } 

public void cam_get_photo() 
{ 
    Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    fileUri = Uri.fromFile(getOutputPhotoFile()); 
    responsetxt.setText(fileUri.toString()); 
    i.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 
    startActivityForResult(i, CAPTURE_IMAGE_ACTIVITY_REQ);   
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQ) 
    { 
     if (resultCode == RESULT_OK) 
     { 
      Uri photoUri; 
      if(data == null) 
      { 
       //Toast.makeText(this, "data null", Toast.LENGTH_LONG).show(); 
       photoUri = fileUri; 
       if(photoUri == null) Toast.makeText(this, "data null", Toast.LENGTH_LONG).show(); 
       else 
       { 
        File myfile = new File(photoUri.toString()); 
        responsetxt.setText(photoUri.toString()); 
       } 
       //String outpath = myfile.getAbsolutePath(); 
       //Toast.makeText(this, outpath, Toast.LENGTH_LONG).show(); 
      } 
      else 
      { 
       Bitmap photo = (Bitmap) data.getExtras().get("data"); 
       if(photo != null) 
        Toast.makeText(this, "Image saved successfully in: \n" + data.getData(), Toast.LENGTH_LONG).show(); 

       ImageView photoImage1 = (ImageView) findViewById(R.id.photo_image); 
       photoImage1.setImageBitmap(photo); 
      } 
     } 
     else if (resultCode == RESULT_CANCELED) 
     { 
      Toast.makeText(this, "Cancelled", Toast.LENGTH_SHORT).show(); 
     } 
     else 
     { 
      Toast.makeText(this, "Callout for image capture failed!", Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

控制返回此代码,在cam_get_photo()方法,我打电话startActivityforResult(),也是我存储了fileURI为全局变量调用startActivityforResult()前覆盖。当从CameraActivity执行返回到MainActivity,我观察,原来MainActivity丢失,并创造了新的MainActivity,因为它的了fileURI的价值已变得无效。所以当我检查onActivityResult()函数中的fileUri的值时,我发现它为空。主要活动时,从摄像机子活动

这是一个特殊的问题,因为我需要访问fileUri这是在存储之前全球在原来的主要活动。但当控制权从Camera子活动返回并且fileUri丢失时,MainActivity会被覆盖。

请提出一些解决方法或方法来解决此问题。如果需要澄清,请告诉我。

+0

PS: - 我还观察到,相机返回的活动中有我的手机屏幕旋转之后。我怀疑由于屏幕旋转,新的主要活动正在创建,原来的主要活动丢失。但我不确定。 –

回答

0

我发现一个答案解决问题的办法在这个环节Camera activity causing uri to go to null when screen orientation changes。其在清单锁定屏幕方向解决。

锁定调用Activity的屏幕方向为我解决了问题。如果您不想锁定自己,则可以创建一个锁定方向的活动来调用相机,然后将结果返回到“真实”活动。

要锁定屏幕方向,要把它放到你的清单(两条线)活动定义:

机器人:screenOrientation = “肖像” 机器人:configChanges = “keyboardHidden |方向|屏幕尺寸”

“画像”,也可以“风景”