2012-01-03 131 views
7

UPDATEAndroid的圖像保存到SD卡

新增

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

到清單現在一切工作正常。

好的,我有一個應用程序,我已經開始創建,最終我希望能夠拍照,然後將您帶到另一個屏幕,讓您能夠「使用」或「重拍」圖片。

當圖像被拿走時,它需要被保存到SD卡上的一個新文件夾中(如果該文件夾不存在,那麼它需要創建它)。幾個星期前,我已經完成了所有這些工作,但是在我做了一些編輯並關閉了eclipse之後,我似乎無法使其恢復工作?

這個部分是在int imageNum = 0;之後我添加了imagesFolder.mkdirs();我相信創建一個新文件夾是正確的,但即使這似乎現在沒有工作。

現在圖像只是被拿走了,新文件夾也沒有被創建或圖像被保存。

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(), "BeatEmUp"); 
     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(); 
     } 

     camera.startPreview(); 
    }}; 


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; 
} 
} 
+2

您是否收到任何類型的錯誤?您的清單是否列出了寫入SD卡的權限? – 2012-01-03 14:23:32

+0

感謝愚蠢的錯誤,不向清單添加權限:) – Matt 2012-01-03 14:28:30

+0

你想添加這個作爲答案,然後我可以接受,它可以幫助其他用戶。 – Matt 2012-01-04 15:00:48

回答

8

你應該確保清單列出寫入SD卡的權限:

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