2011-08-19 22 views
7

मैं तस्वीर को बाइट लेने के बाद एंड्रॉइड के लिए कैमरा कोड का उपयोग कर रहा हूं [] imageData पैरामीटर शून्य है, मुझे नहीं पता क्यों।एंड्रॉइड पिक्चर कॉल बैक डेटा शून्य है

package com.pictures; 

import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 


import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.PixelFormat; 
import android.graphics.Bitmap.CompressFormat; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.Window; 
import android.view.WindowManager; 
import android.view.View.OnClickListener; 
import android.view.View.OnTouchListener; 

public class CamaraView extends Activity implements SurfaceHolder.Callback, 
     OnClickListener { 
    static final int FOTO_MODE = 0; 
    private static final String TAG = "CameraTest"; 
    Camera mCamera; 
    boolean mPreviewRunning = false; 
    private Context mContext = this; 

    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     Log.e(TAG, "onCreate"); 

     Bundle extras = getIntent().getExtras(); 

     getWindow().setFormat(PixelFormat.TRANSLUCENT); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.main); 
     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[] imageData, Camera c) { 

      if (imageData != null) { 

       Intent mIntent = new Intent(); 

       StoreByteImage(mContext, imageData, 50, 
         "ImageName"); 
       mCamera.startPreview(); 

       setResult(FOTO_MODE, mIntent); 
       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(); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     Log.e(TAG, "surfaceCreated"); 
     mCamera = Camera.open(); 

    } 

    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(w, h); 
     mCamera.setParameters(p); 

     try { 
      mCamera.setPreviewDisplay(holder); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      System.out.println("Caught exception in surface chagned"); 
      e.printStackTrace(); 
     } 
     mCamera.startPreview(); 
     mPreviewRunning = true; 

    } 

    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 arg0) { 

     mCamera.takePicture(null, mPictureCallback, mPictureCallback); 

    } 

    public static boolean StoreByteImage(Context mContext, byte[] imageData, 
      int quality, String expName) { 

     File sdImageMainDirectory = new File("/sdcard"); 
     FileOutputStream fileOutputStream = null; 
     String nameFile; 
     try { 

      BitmapFactory.Options options=new BitmapFactory.Options(); 
      options.inSampleSize = 5; 

      Bitmap myImage = BitmapFactory.decodeByteArray(imageData, 0, 
        imageData.length,options); 


      fileOutputStream = new FileOutputStream(
        sdImageMainDirectory.toString() +"/image.jpg"); 


      BufferedOutputStream bos = new BufferedOutputStream(
        fileOutputStream); 

      myImage.compress(CompressFormat.JPEG, quality, bos); 

      bos.flush(); 
      bos.close(); 

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

     return true; 
    } 

} 
+0

वास्तव में शून्य क्या है? कॉलबैक में प्राप्त डेटा के सूचक, एसडी कार्ड पर फ़ाइल की सामग्री? –

+0

हाय, इस लाइन डेटा पैरामीटर पर पिक्चरटेकन (बाइट [] डेटा, कैमरा कैमरा) पर सार्वजनिक शून्य शून्य है ... – max

+0

अच्छा, इसमें बहुत सारे ग्राउंड हो सकते हैं - कैमरा कॉन्फ़िगरेशन किसी भी तरह मुश्किल है। यह देखना आवश्यक होगा कि आप कैमरे को कैसे कॉन्फ़िगर करते हैं, और कॉलबैक –

उत्तर

9

ठीक है, मुझे समस्या दिखाई देती है। आप कच्चे और जेपीईजी कॉलबैक दोनों के लिए चित्र कॉलबैक का पुन: उपयोग कर रहे हैं। Javadoc से AND आप पढ़ सकते हैं:

एक असीमित छवि कैप्चर ट्रिगर करता है। कैमरा सेवा एप्लिकेशन पर कॉलबैक की एक श्रृंखला शुरू करेगी क्योंकि छवि कैप्चर प्रगति करता है। छवि कैप्चर करने के बाद शटर कॉलबैक होता है। इसका उपयोग उपयोगकर्ता को यह जानने के लिए ध्वनि को ट्रिगर करने के लिए किया जा सकता है कि छवि पर कब्जा कर लिया गया है। कच्चे कॉलबैक तब होता है जब कच्चे छवि डेटा उपलब्ध होते हैं (नोट: यदि कोई कच्ची छवि कॉलबैक बफर उपलब्ध नहीं है या कच्ची छवि कॉलबैक बफर कच्ची छवि को पकड़ने के लिए पर्याप्त नहीं है तो डेटा शून्य होगा)। पोस्टव्यू कॉलबैक तब होता है जब एक स्केल, पूरी तरह संसाधित पोस्टव्यू छवि उपलब्ध है (नोट: सभी हार्डवेयर इसका समर्थन नहीं करता है)। जेपीईजी कॉलबैक तब होता है जब संकुचित छवि उपलब्ध है। यदि एप्लिकेशन को किसी विशेष कॉलबैक की आवश्यकता नहीं है, तो कॉलबैक विधि के बजाय शून्य को पास किया जा सकता है।

तो अगर इसे कच्चे कॉलबैक के रूप में कहा जाता है, तो डेटा शून्य हो सकता है। यदि आपको कच्चे डेटा पसंद नहीं हैं, तो बस उपयोग करें:

mCamera.takePicture(null, null, mPictureCallback); 
+0

@ Konstantin Pribluda धन्यवाद और बहुत कुछ काम किया। – max

+1

यह मोटोरोला पर काम नहीं करता है! – Toshe

+0

ठीक है, मेरे मामले में सबकुछ सैमसंग गैलेक्सी नोट और अन्य उच्च अंत उपकरणों पर ठीक काम करता है, यह एमुलेटर पर भी बहुत अच्छा काम करता है, लेकिन एचटीसी वाइल्डफायर एस और अन्य ऐसे कम अंत उपकरणों जैसे उपकरणों पर, –

संबंधित मुद्दे