2011-12-22 69 views
0

我有一个应用程序,目前使用相机拍摄图像,此刻一旦图像被保存到SD卡上的文件夹,然后同一屏幕保持所以可以拍摄另一张照片。Android意图打开带图片的新屏幕

我想要它,所以当图像已被采取和保存一个新的屏幕打开与新屏幕上的图片。

我已经制作了一个新的xml文件punch.xml和java Punch.java并将它们注册到清单中我只是无法弄清楚如何设置应用程序以打开刚刚拍摄的图片的新屏幕。

我猜这是一旦图像被保存后打开新的Intent

更新

确定,所以所有的工作现在execpt获得的图像显示在下一屏幕上?

Punch.java

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.punch); 

    String myRef = this.getIntent().getStringExtra("filepath"); 
} 

AndroidCamera.java 更新,以反映代码更改

public class AndroidCamera extends Activity implements SurfaceHolder.Callback{ 

Camera camera; 
SurfaceView surfaceView; 
SurfaceHolder surfaceHolder; 
boolean previewing = false; 
LayoutInflater controlInflater = null; 

final int RESULT_SAVEIMAGE = 0; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

    getWindow().setFormat(PixelFormat.UNKNOWN); 
    surfaceView = (SurfaceView)findViewById(R.id.camerapreview); 
    surfaceHolder = surfaceView.getHolder(); 
    surfaceHolder.addCallback(this); 
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    controlInflater = LayoutInflater.from(getBaseContext()); 
    View viewControl = controlInflater.inflate(R.layout.control, null); 
    LayoutParams layoutParamsControl 
     = new LayoutParams(LayoutParams.FILL_PARENT, 
     LayoutParams.FILL_PARENT); 
    this.addContentView(viewControl, layoutParamsControl); 

    Button buttonTakePicture = (Button)findViewById(R.id.takepicture); 
    buttonTakePicture.setOnClickListener(new Button.OnClickListener(){ 

     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
      camera.takePicture(myShutterCallback, 
        myPictureCallback_RAW, myPictureCallback_JPG); 


     }}); 
} 

ShutterCallback myShutterCallback = new ShutterCallback(){ 

    public void onShutter() { 
     // TODO Auto-generated method stub 

    }}; 

PictureCallback myPictureCallback_RAW = new PictureCallback(){ 

    public void onPictureTaken(byte[] arg0, Camera arg1) { 
     // TODO Auto-generated method stub 

    }}; 

PictureCallback myPictureCallback_JPG = new PictureCallback(){ 

    public void onPictureTaken(byte[] arg0, Camera arg1) { 
     // TODO Auto-generated method stub 
     /*Bitmap bitmapPicture 
      = BitmapFactory.decodeByteArray(arg0, 0, arg0.length); */ 
     int imageNum = 0; 
     Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     File imagesFolder = new File(Environment.getExternalStorageDirectory(), "Punch"); 
     imagesFolder.mkdirs(); // <---- 
     String fileName = "image_" + String.valueOf(imageNum) + ".jpg"; 
     File output = new File(imagesFolder, fileName); 
     while (output.exists()){ 
      imageNum++; 
      fileName = "image_" + String.valueOf(imageNum) + ".jpg"; 
      output = new File(imagesFolder, fileName); 
     } 

     Uri uriSavedImage = Uri.fromFile(output); 
     imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); 


     OutputStream imageFileOS; 
     try { 
      imageFileOS = getContentResolver().openOutputStream(uriSavedImage); 
      imageFileOS.write(arg0); 
      imageFileOS.flush(); 
      imageFileOS.close(); 

      Toast.makeText(AndroidCamera.this, 
        "Image saved", 
        Toast.LENGTH_LONG).show(); 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     Intent intent = new Intent(getBaseContext(), Punch.class); 
     intent.putExtra("filepath",uriSavedImage); 
     //just using a request code of zero 
     int request=0; 
     startActivityForResult(intent,request); 
    }}; 

public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    // TODO Auto-generated method stub 
    if(previewing){ 
     camera.stopPreview(); 
     previewing = false; 
    } 

    if (camera != null){ 
     try { 
      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 
      previewing = true; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

    camera = Camera.open(); 
    try { 
      Camera.Parameters parameters = camera.getParameters(); 
      if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) { 
       // This is an undocumented although widely known feature 
       parameters.set("orientation", "portrait"); 
       // For Android 2.2 and above 
       camera.setDisplayOrientation(90); 
       // Uncomment for Android 2.0 and above 
       parameters.setRotation(90); 
      } else { 
       // This is an undocumented although widely known feature 
       parameters.set("orientation", "landscape"); 
       // For Android 2.2 and above 
       camera.setDisplayOrientation(0); 
       // Uncomment for Android 2.0 and above 
       parameters.setRotation(0); 
      } 
      camera.setParameters(parameters); 
      camera.setPreviewDisplay(holder); 
     } catch (IOException exception) { 
     camera.release(); 

     } 
     camera.startPreview(); 

    } 


public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    camera.stopPreview(); 
    camera.release(); 
    camera = null; 
    previewing = false; 
} 
} 

UPDATE

望着建议使用putExtra()怎么办我设置和检索这个值?

+0

'getIntent()getStringExtra()来的setResult;' – Merlin 2011-12-22 13:41:26

+0

获得如上,如果你正在使用Eclipse和Android插件它应该表现出你putExtra工具提示(字符串名称,对象在这里);所以它会像intent.putExtra(“filepath”,new String(Environment.getExternalStorageDirectory()+“/ image.jpg”)或任何字符串到您的文件位置。然后,正如Merlin在新的新的活动你打电话的意图,以获得您可以在您的活动中使用的值,如:this.getIntent()。getStringExtra(filepath); – Davos555 2011-12-22 14:25:10

+0

@ Davos555我有点得到你的意思,但仍然不知道如何实现可以你用新的代码更新你的答案? – Matt 2011-12-22 14:32:59

回答

1

这里的问题是,你在你的pictureTaken回调调用

camera.startPreview(); 

你与你的代码的onClick代替它,改变它startActivityForResult():

Intent intent = new Intent(getBaseContext(), Punch.class); 
    intent.putExtra("filepath",uriSavedImage); 
    //just using a request code of zero 
    int request=0; 
    startActivityForResult(intent,request); 

然后你就可以实现onActivityResult并从那里调用camera.StartPreview()

不要忘了在冲床活动

+0

仍然不真正了解如何实现setResult和onActivityResult – Matt 2011-12-22 14:59:46

+0

我还需要知道如何设置imageURi使用@ Davos55回答它似乎像String(Environment.getExternalStorageDirectory()+“/ imagesFolder”+“/文件名” – Matt 2011-12-22 15:06:00

+0

OK现在即时获取** startActivityForResult错误**应该不只是** startActivity **?那么我需要把** camera.StartPreview()**到Punch.java中?如果你想看看,我是否更新了问题代码? – Matt 2011-12-22 15:09:22

1

您可以保存对图像保存位置的引用,并将其放在意图打开新的活动的位置。开始新的活动并显示图像,允许用户删除等。

Intent intent = new Intent(getBaseContext(), target.class); 
intent.putExtra("ImageReference", reference); 
startActivity(intent); 

而target.class是您的活动类的名称。

+0

这是有道理的,但我怎么可以将它添加到我的代码,所以它会自动地进入一个新的屏幕与图片一旦它被拿走? – Matt 2011-12-22 12:56:46

+0

我认为你可以将此添加到onclick方法,当你把你的照片,文件保存后等,然后获取参考存储在任何格式的文件的参考,并将其发送到新的活动 – Davos555 2011-12-22 13:01:48

+0

我已经更新了我的问题给你 – Matt 2011-12-22 13:07:01

1

因此,在上面的代码中,您似乎正在设置好意图。拍摄照片后会立即运行。

很明显,您需要引用保存文件的位置。然后,在你打电话Punch.class新活动类,你需要做这样的事情: -

String myRef = this.getIntent().getStringExtra("ImageReference"); 

这将意味着你的主要活动传递的字符串文件路径为新Punch.class你创建。在这里您可以使用文件路径打开图像。

+0

好吧,我已经更新了我的问题,几乎在那里,我认为只需要正确地维护AndroidCamera.java中的图像就不能指出那部分? – Matt 2011-12-22 14:45:11

+0

在您的代码和文件imagesFolder对象中搜索文件名。然后你把它们放在一起,你有文件路径/参考。 – Davos555 2011-12-22 14:54:28

+0

所以它会是String(Environment.getExternalStorageDirectory()+“/ filename”+“/ imagesFolder”? – Matt 2011-12-22 14:58:52