2016-06-13 8 views
-4

Ich habe Probleme beim Speichern des Bildes in ein bestimmtes Verzeichnis mit bestimmten Namen gespeichert. Ich habe keine Ahnung, wie es geht. Unten ist mein Code.Speichern Bild in einem bestimmten Verzeichnis mit bestimmten Namen

CameraCaptureImage.java

public class CaptureCameraImage extends Activity { 

    public static int cameraID = 0; 
    public static boolean isBlack = true; 
    public static ImageView image; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activitycapturecameraimage); 
     image = (ImageView) findViewById(R.id.imgView); 
    } 



    public void onBackClick(View v){ 


     cameraID = 0; 
     Intent i = new Intent(CaptureCameraImage.this,CameraView.class); 
     startActivityForResult(i, 999); 
    } 

} 

CameraView.java

public class CameraView extends Activity implements SurfaceHolder.Callback, OnClickListener{ 
     private static final String TAG = "CameraTest"; 
     Camera mCamera; 
     boolean mPreviewRunning = false; 

     @SuppressWarnings("deprecation") 
     public void onCreate(Bundle icicle){ 
      super.onCreate(icicle); 
      Log.e(TAG, "onCreate"); 

      getWindow().setFormat(PixelFormat.TRANSLUCENT); 
      requestWindowFeature(Window.FEATURE_NO_TITLE); 
      getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 
      setContentView(R.layout.cameraview); 
      ImageView img = (ImageView) findViewById(R.id.blankImage); 

      if(CaptureCameraImage.isBlack) 
       img.setBackgroundResource(android.R.color.black); 
      else 
       img.setBackgroundResource(android.R.color.white); 

      mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera); 
      mSurfaceView.setOnClickListener(this); 
      mSurfaceHolder = mSurfaceView.getHolder(); 
      mSurfaceHolder.addCallback(this); 
      mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     } 

     @Override 
     protected void onRestoreInstanceState(Bundle savedInstanceState){ 
      super.onRestoreInstanceState(savedInstanceState); 
     } 


     Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 

      public void onPictureTaken(byte[] data, Camera camera) { 
       // TODO Auto-generated method stub 
       if (data != null){ 
        //Intent mIntent = new Intent(); 
        //mIntent.putExtra("image",imageData); 

        mCamera.stopPreview(); 
        mPreviewRunning = false; 
        mCamera.release(); 

        try{ 
         BitmapFactory.Options opts = new BitmapFactory.Options(); 
         Bitmap bitmap= BitmapFactory.decodeByteArray(data, 0, data.length,opts); 
         bitmap = Bitmap.createScaledBitmap(bitmap, 300, 300, false); 
         int width = bitmap.getWidth(); 
         int height = bitmap.getHeight(); 
         int newWidth = 300; 
         int newHeight = 300; 

         // calculate the scale - in this case = 0.4f 
         float scaleWidth = ((float) newWidth)/width; 
         float scaleHeight = ((float) newHeight)/height; 

         // createa matrix for the manipulation 
         Matrix matrix = new Matrix(); 
         // resize the bit map 
         matrix.postScale(scaleWidth, scaleHeight); 
         // rotate the Bitmap 
         matrix.postRotate(90); 
         Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, 
           width, height, matrix, true); 
         CaptureCameraImage.image.setImageBitmap(resizedBitmap); 

        }catch(Exception e){ 
         e.printStackTrace(); 
        } 
        //StoreByteImage(mContext, imageData, 50,"ImageName"); 
        //setResult(FOTO_MODE, mIntent); 
        setResult(585); 
        finish(); 
       }  
      } 
     }; 

     protected void onResume(){ 
      Log.e(TAG, "onResume"); 
      super.onResume(); 
     } 

     protected void onSaveInstanceState(Bundle outState){ 
      super.onSaveInstanceState(outState); 
     } 

     protected void onStop(){ 
      Log.e(TAG, "onStop"); 
      super.onStop(); 
     } 

     @TargetApi(9) 
     public void surfaceCreated(SurfaceHolder holder){ 
      Log.e(TAG, "surfaceCreated"); 
      mCamera = Camera.open(CaptureCameraImage.cameraID); 
     } 

     public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
      Log.e(TAG, "surfaceChanged"); 

      // XXX stopPreview() will crash if preview is not running 
      if (mPreviewRunning){ 
       mCamera.stopPreview(); 
      } 

      Camera.Parameters p = mCamera.getParameters(); 
      p.setPreviewSize(300, 300); 

      if(CaptureCameraImage.cameraID == 0){ 
       String stringFlashMode = p.getFlashMode(); 
       if (stringFlashMode.equals("torch")) 
         p.setFlashMode("on"); // Light is set off, flash is set to normal 'on' mode 
       else 
         p.setFlashMode("torch"); 
      } 

      mCamera.setParameters(p); 
      try{ 
       mCamera.setPreviewDisplay(holder); 
      }catch (Exception e){ 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      mCamera.startPreview(); 
      mPreviewRunning = true; 
      mCamera.takePicture(null, mPictureCallback, mPictureCallback); 
     } 

     public void surfaceDestroyed(SurfaceHolder holder) { 
      Log.e(TAG, "surfaceDestroyed"); 
      //mCamera.stopPreview(); 
      //mPreviewRunning = false; 
      //mCamera.release(); 
     } 

     private SurfaceView mSurfaceView; 
     private SurfaceHolder mSurfaceHolder; 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      mCamera.takePicture(null, mPictureCallback, mPictureCallback); 
     } 

    } 
+0

Mögliche Duplikate von [Android: Bild speichern an Ort] (http://stackoverflow.com/questions/3844391/android-image-save-to-location) –

+0

Ich habe schon versucht das funktioniert nicht. – rakesh

+0

"Bitte antworten Sie sofort, da dies dringend ist" ist kein geeigneter Weg, um Freiwillige anzusprechen. Bitte lernen Sie etwas Zeitmanagement, etwas Geduld und etwas Respekt. – halfer

Antwort

0

Um ein Bild aufzunehmen und es in einem bestimmten Ordner zu speichern, müssen Sie:

  1. Antrag auf Genehmigung auf Laufzeit (API 23)
  2. Anfrage Bildaufnahme
  3. Erstellen Sie den Ordner

Vor allem, wenn Sie API-Target 23, müssen Sie das neue Berechtigungssystem folgen, die den Benutzer auffordert, es nur zu gewähren, wenn zum ersten Mal verwendet. In Ihrem Fall muss WRITE_EXTERNAL_STORAGE gewährt werden.

boolean hasPermission = (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED); 

    if (!hasPermission) { 
     ActivityCompat.requestPermissions(this, 
       new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
       REQUEST_WRITE_STORAGE); 
    } 

Dann müssen Sie eine implizite Absicht erstellen, um ein Foto zu erfassen. Die Kamera-App könnte in der App-Auswahl erscheinen oder je nach Benutzereinstellungen und installierten Apps automatisch ausgewählt werden.

Schließlich müssen Sie den Ordner erstellen und die zusätzliche Ausgabe angeben, damit Android weiß, wo das Bild gespeichert werden soll.

//Intent i = new intent... 

        long timestamp = System.currentTimeMillis(); 

        File file = new File(""); 

         file = new File(Environment.getExternalStorageDirectory() 
          + File.separator 
          + "DCIM" 
          + File.separator 
          + address 
          + File.separator 
          , "IMG_" + String.valueOf(timestamp) + ".jpg"); 

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); 

//startActivityForResult... 

Es gibt viele Speichermöglichkeiten. Sie können einen Blick hier werfen: https://developer.android.com/training/basics/data-storage/files.html

Ich habe nichts Besonderes in OnActivityResult Callback-Methode gemacht. Ich zeige nur einen Toast, um den Benutzer zu bestätigen, dass das Bild erfolgreich gespeichert wurde. Der gesamte obige Code ist in meinem Fall im onClickListener einer imageView.

Verwandte Themen