2014-04-29 45 views
0

我正在制作相机应用程序,该相机应用程序在相机第一次启动时拍摄一张图像,但我得到它的唯一问题是当拍摄照片时,它会存储在文件夹中的第一个图像。例如。我安装应用程序,相机拍摄一张照片,然后下一次相机拍摄另一张照片时,它与第一张相同。我试图在数据= null之后,但是这仍然不起作用。Android相机应用程序照片复制图像

有什么建议吗?

package com.example.charlie; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.text.SimpleDateFormat; 
import java.util.Date; 



public class PService2 extends Service { 
    //private myPreview mPreview; 

    Camera mCamera; 
    byte[] data; 

    private void PictureCallback() 
    { 


    } 

    private final class TakePhotoReceiver extends BroadcastReceiver { 
     public final Camera mCamera; 

     private TakePhotoReceiver(Camera mCamera) { 

      this.mCamera = mCamera; 

     } 

     @Override 
     public void onReceive(Context context, Intent intent) { 

      try {// TODO Auto-generated method stub 
      Log.v("test", "Got here"); 
      mCamera.takePicture(null, null, mPicture); 
      //releaseCamera(); 
      } finally { 
       releaseCamera(); 
      } 
     } 

     private Camera.PictureCallback mPicture = new Camera.PictureCallback() { 
      @Override 
      public void onPictureTaken(byte[] data2,Camera camera) { 
       Log.v("test", "image taken"); 
       data = data2; 

       createExternalStoragePublicPicture(data); 
       data = null; 
       data2 = null; 
       //releaseCamera(); 
      } 
     }; 
    } 



     } 
     */ 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    String mCurrentPhotoPath; 
    void createExternalStoragePublicPicture(byte[] data) { 

     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     String imageFileName = "JPEG_" + timeStamp + ".jpg"; 
     File image = Environment 
       .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
     File file = new File(image, imageFileName); 

     try { 

      image.mkdirs(); 


      OutputStream os = new FileOutputStream(file); 
      os.write(data); 
      os.close(); 


      MediaScannerConnection.scanFile(this, 
        new String[] { file.toString() }, null, 
        new MediaScannerConnection.OnScanCompletedListener() { 
         @Override 
         public void onScanCompleted(String path, Uri uri) { 
          Log.i("ExternalStorage", "Scanned " + path + ":"); 
          Log.i("ExternalStorage", "-> uri=" + uri); 
         } 
        }); 
     } catch (IOException e) { 

      Log.w("ExternalStorage", "Error writing " + file, e); 
     } 
     data = null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     System.out.println("Service Started"); 
     Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show(); 
     try { 
      //releaseCamera(); 
      final Camera mCamera = Camera.open(0); 

      //myPreview mPreview = new myPreview(this, mCamera); 
      //FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
      // preview.addView(mPreview); 
      this.registerReceiver(new TakePhotoReceiver(mCamera), 
        new IntentFilter(Intent.ACTION_SCREEN_ON)); 
        //releaseCamera(); 
      //mCamera.stopPreview(); 
      //mCamera.stopPreview(); 




     } catch (Exception e) { 
      Log.e(getString(R.string.app_name), "failed to open Camera"); 
      e.printStackTrace(); 
     } 

     return START_STICKY; 

    } 

    private void releaseCamera() { 

     if (mCamera != null) { 
      mCamera.release(); 
      mCamera = null; 
     } 


    } 

    private FrameLayout findViewById(int cameraPreview) { 
     // TODO Auto-generated method stub 
     return null; 
    } 


    @Override 
    public void onDestroy() { 
     System.out.println("Service Stopped"); 
     super.onDestroy(); 
     mCamera.release(); 
     //unregisterReceiver(this.TakePhotoReceiver); 
     Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show(); 
    } 

} 

回答

0
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.text.SimpleDateFormat; 

import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.hardware.Camera; 
import android.media.MediaScannerConnection; 
import android.net.Uri; 
import android.os.Environment; 
import android.os.IBinder; 
import android.util.Log; 


public class PictureService extends Service 
{ 
    private static final String TAG = PictureService.class.getSimpleName(); 

    private TakePhotoReceiver mReceiver; 



    @Override 
    public void onCreate() 
    { 
     super.onCreate(); 
     Log.d(TAG, "onCreate"); 
     mReceiver = new TakePhotoReceiver(0); 
     registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON)); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) 
    { 
     return null; 
    } 

    @Override 
    public void onDestroy() 
    { 
     super.onDestroy(); 
     Log.d(TAG, "onDestroy"); 
     unregisterReceiver(mReceiver); 
    } 


    private final class TakePhotoReceiver extends BroadcastReceiver 
     implements Camera.PictureCallback 
    { 
     public final int mCameraId; 


     private TakePhotoReceiver(int cameraId) 
     { 
      mCameraId = cameraId; 
     } 

     @Override 
     public void onReceive(Context context, Intent intent) 
     { 
      try{ 
       Camera camera = Camera.open(mCameraId); 
       try{ 
        Log.d(TAG, "onReceive: Taking picture"); 
        camera.takePicture(null, null, this); 
       } 
       finally{ 
        camera.release(); 
        camera = null; 
       } 
      } 
      catch(Exception e){ 
       Log.w(TAG, "onReceive: error with camera " + mCameraId, e); 
      } 
     } 

     @Override 
     public void onPictureTaken(byte[] data, Camera camera) 
     { 
      Log.d(TAG, "onPictureTaken"); 
      File picturesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
      savePictureTo(picturesDir, data); 
     } 
    } 

    private void savePictureTo(File directory, byte[] data) 
    { 
     String fileName = new SimpleDateFormat("'JPEG_'yyyyMMdd_HHmmss'.jpg'") 
      .format(System.currentTimeMillis()); 
     File file = new File(directory, fileName); 
     try{ 
      directory.mkdirs(); 
      OutputStream os = new FileOutputStream(file); 
      os.write(data); 
      os.close(); 

      MediaScannerConnection.scanFile(this, new String[ ] { file.toString() }, 
       null, new MediaScannerConnection.OnScanCompletedListener() 
      { 
       @Override 
       public void onScanCompleted(String path, Uri uri) 
       { 
        Log.d(TAG, "savePictureTo: scanned path=" + path + ", uri=" + uri); 
       } 
      }); 
     } 
     catch(IOException e){ 
      Log.w(TAG, "savePictureTo: error writing " + file, e); 
     } 
    } 
} 
相关问题