2011-06-19 10 views
15

मैं एक एंड्रॉइड कैमरा से फोकस दूरी (फोटो में विषय की दूरी) पढ़ने की कोशिश कर रहा हूं। मैं अपने एचटीसी डिजायर पर सभी फोकस दूरी के लिए 0 प्राप्त कर रहा हूं, भले ही यह सही ढंग से ऑटोफोकस हो। यहां पूरा ऐप है, केवल v2.3.3 और ऊपर काम करता है।कैमरा फोकस दूरी

ImageCapture.java

package test.test; 

import java.io.IOException; 
import java.io.OutputStream; 
import java.text.SimpleDateFormat; 

import android.app.Activity; 
import android.content.Intent; 
import android.graphics.PixelFormat; 
import android.hardware.Camera; 
import android.hardware.Camera.AutoFocusCallback; 
import android.hardware.Camera.PictureCallback; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.MediaStore.Images.Media; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.MenuItem; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

//THIS CLASS READS THE FOCUS DISTANCES 
class ImageFocusCallback implements AutoFocusCallback { 
    @Override 
    public void onAutoFocus(boolean success, Camera camera) { 
     //READ FOCUS DISTANCES HERE 
     Camera.Parameters parameters = camera.getParameters(); 
     float[] distances = new float[3]; 
     if (success) { 
      // Only available with Android 9 (2.3) 
      // Focus Mode is always reported as auto but 
      // distances do not appear to be updating 
      // always: 0.1, 1.2, Infinity, (on my device it's 0,0,0) 
      Log.d("Focus Mode: ", parameters.getFocusMode()); 
      parameters.getFocusDistances(distances); 
      Log.d("focus distance near", Float.toString(distances[0])); 
      Log.d("focus distance optimum", Float.toString(distances[1])); 
      Log.d("focus distance far", Float.toString(distances[2])); 
     } 
    } 
} 

public class ImageCapture extends Activity implements SurfaceHolder.Callback { 
    //CALL AUTO FOCUS HERE 
    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { 
      ImageFocusCallback autoFocusCallBack = new ImageFocusCallback(); 
      //AUTOFOCUS IS CALLED HERE 
      camera.autoFocus(autoFocusCallBack); 
      return true; 
     } 
     return false; 
    } 

    //REST OF THE CODE 
    private Camera   camera; 
    private boolean   isPreviewRunning = false; 
    private SimpleDateFormat timeStampFormat = new SimpleDateFormat("yyyyMMddHHmmssSS"); 

    private SurfaceView  surfaceView; 
    private SurfaceHolder surfaceHolder; 
    private Uri    target   = Media.EXTERNAL_CONTENT_URI; 


    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     Log.e(getClass().getSimpleName(), "onCreate"); 
     getWindow().setFormat(PixelFormat.TRANSLUCENT); 
     setContentView(R.layout.main); 
     surfaceView = (SurfaceView) findViewById(R.id.surface); 
     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(android.view.Menu menu) { 
     MenuItem item = menu.add(0, 0, 0, "goto gallery"); 
     item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem item) { 
       Intent intent = new Intent(Intent.ACTION_VIEW, target); 
       startActivity(intent); 
       return true; 
      } 
     }); 
     return true; 
    } 

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

    Camera.PictureCallback mPictureCallbackRaw = new Camera.PictureCallback() { 
                @Override 
                public void onPictureTaken(byte[] data, Camera c) { 
                 Log.e(getClass().getSimpleName(), "PICTURE CALLBACK RAW: " + data); 
                 camera.startPreview(); 
                } 
               }; 

    Camera.PictureCallback mPictureCallbackJpeg = new Camera.PictureCallback() { 
                @Override 
                public void onPictureTaken(byte[] data, Camera c) { 
                 Log.e(getClass().getSimpleName(), "PICTURE CALLBACK JPEG: data.length = " + data); 
                } 
               }; 

    Camera.ShutterCallback mShutterCallback  = new Camera.ShutterCallback() { 
                @Override 
                public void onShutter() { 
                 Log.e(getClass().getSimpleName(), "SHUTTER CALLBACK"); 
                } 
               }; 




    // ImageCaptureCallback iccb = null; 
    // if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { 
    // try { 
    // String filename = timeStampFormat.format(new Date()); 
    // ContentValues values = new ContentValues(); 
    // values.put(Media.TITLE, filename); 
    // values.put(Media.DESCRIPTION, "Image capture by camera"); 
    // Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, 
    // values); 
    // // String filename = timeStampFormat.format(new Date()); 
    // iccb = new 
    // ImageCaptureCallback(getContentResolver().openOutputStream(uri)); 
    // } catch (Exception ex) { 
    // ex.printStackTrace(); 
    // Log.e(getClass().getSimpleName(), ex.getMessage(), ex); 
    // } 
    // } 
    // if (keyCode == KeyEvent.KEYCODE_BACK) { 
    // return super.onKeyDown(keyCode, event); 
    // } 
    // 
    // if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { 
    // camera.takePicture(mShutterCallback, mPictureCallbackRaw, iccb); 
    // return true; 
    // } 
    // 
    // return false; 
    // } 

    @Override 
    protected void onResume() { 
     Log.e(getClass().getSimpleName(), "onResume"); 
     super.onResume(); 
    } 

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

    @Override 
    protected void onStop() { 
     Log.e(getClass().getSimpleName(), "onStop"); 
     super.onStop(); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     Log.e(getClass().getSimpleName(), "surfaceCreated"); 
     camera = Camera.open(); 
     Camera.Parameters parameters = camera.getParameters(); 
     float[] distances = new float[3]; 
     Log.d("Focus Mode: ", parameters.getFocusMode()); 
     parameters.getFocusDistances(distances); 
     Log.d("focus distance 0", Float.toString(distances[0])); 
     Log.d("focus distance 1", Float.toString(distances[1])); 
     Log.d("focus distance 2", Float.toString(distances[2])); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     Log.e(getClass().getSimpleName(), "surfaceChanged"); 
     if (isPreviewRunning) { 
      camera.stopPreview(); 
     } 
     Camera.Parameters p = camera.getParameters(); 
     p.setPreviewSize(w, h); 
     camera.setParameters(p); 
     try { 
      camera.setPreviewDisplay(holder); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     camera.startPreview(); 
     isPreviewRunning = true; 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     Log.e(getClass().getSimpleName(), "surfaceDestroyed"); 
     camera.stopPreview(); 
     isPreviewRunning = false; 
     camera.release(); 
    } 

} 



class ImageCaptureCallback implements PictureCallback { 

    private OutputStream filoutputStream; 

    public ImageCaptureCallback(OutputStream filoutputStream) { 
     this.filoutputStream = filoutputStream; 
    } 

    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     try { 
      Log.v(getClass().getSimpleName(), "onPictureTaken=" + data + " length = " + data.length); 
      filoutputStream.write(data); 
      filoutputStream.flush(); 
      filoutputStream.close(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

} 
} 

main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 
    <SurfaceView android:id="@+id/surface" 
    android:layout_width="fill_parent" 
     android:layout_height="10dip" 
     android:layout_weight="1"> 
    </SurfaceView> 
</LinearLayout> 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="test.test" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="10" /> 
    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-feature android:name="android.hardware.camera" /> 
<uses-feature android:name="android.hardware.camera.autofocus" /> 

    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".ImageCapture" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

    </application> 
</manifest> 

यह हो सकता है वहाँ डिवाइस ड्राइवर में एक बग है कि कि? एंड्रॉइड स्रोत में कैमरा.जावा दूरी को पढ़ने के लिए देशी_autoFocus() और देशी_get पैरामीटर() को कॉल करें। क्या किसी को पता है कि देशी कॉल के लिए स्रोत कहां प्राप्त करें?

उत्तर

0

शायद यह कैमरा ड्राइवर में एक बग है, अगर आप इसे फिर से फोन करते हैं तो आप इसे ठीक कर सकते हैं, हाँ मुझे पता है कि यह वास्तव में शर्मीली है, लेकिन मुझे भी वही समस्या ठीक थी।

लेकिन मैंने अपने डिवाइस के लिए कस्टम रोम का उपयोग करने का विकल्प चुना। एंड्रॉइड क्रांति एचडी 6.1.1 http://forum.xda-developers.com/showthread.php?t=840040

अपने सुरक्षित प्रश्न के लिए आप रोम के साथ डाउनलोड किए गए पैकेज से कैमरा ऐप के लिए स्रोत फ़ाइल निकाल सकते हैं। शायद अगर आप इसे बदलते हैं, तो यह काम करेगा।

बेस्ट सादर

2

Froyo में, चौखटे/आधार/कोर/JNI/android_hardware_Camera.cpp लागू करता native_autoFocus() कॉल android_hardware_Camera_autoFocus() है, जो उपकरण/विक्रेता विशिष्ट कोड को रन टाइम पर बाध्य करने के लिए प्रकट होता है द्वारा।

दुर्भाग्यवश, "अगर कैमरा ऑटो फोकस और ऑटोफोकस का समर्थन नहीं करता है, तो ऑटोफोकस को तुरंत सफलता के नकली मूल्य के साथ बुलाया जाएगा।" एक documented behavior है।

मैं उत्सुक जो कार्यों आपके द्वारा उपयोग की 2.3.3, एपीआई स्तर से 10

+0

getFocusDistances है()। ऑटोफोकस() ठीक काम करता है। – siamii

+0

मैं कुछ फ्रायओ उपकरणों पर प्रोग्राम को आजमा सकता हूं, लेकिन आप स्पष्ट रूप से 2.3.3/जिंजरब्रेड के लिए कॉल करते हैं। आप जिन कॉलों का उपयोग करते हैं, उन्हें वास्तव में इसकी आवश्यकता है? –

0

मैं जहां देशी कॉल के लिए स्रोत प्राप्त कर सकते हैं पता नहीं है की आवश्यकता है। लेकिन GetFocusDistances (फ्लोट []) विधि में सभी फोकस दूरी के लिए 0 प्राप्त करने के बारे में क्या, आप this issue पढ़ सकते हैं। वहां आप पढ़ सकते हैं कि यह त्रुटि डिवाइस की त्रुटि नहीं है बल्कि एंड्रॉइड एसडीके की है।

0

यह बग 14341 है - "कैमरा द्वारा लौटाई गई दूरी। पैरामीटर .getFocusDistances() वास्तविक फोकस दूरी के बावजूद नेक्सस एस पर नहीं बदलते हैं"।

पहली बार 26 मार्च, 2011 को अंतिम रिपोर्ट के साथ 26 जनवरी, 2011 को रिपोर्ट की गई। इस प्रकार, बग की रिपोर्ट में आने से कुछ समय पहले ही इसकी सूचना मिली थी और इस दिन तय नहीं किया गया है। यह विशेष रूप से आपके डिवाइस के खिलाफ रिपोर्ट किया गया है।

इस बग "नेक्सस एस" को प्रभावित करता है रिपोर्ट दावे में विभिन्न टिप्पणियां, "एचटीसी सेंसेशन", "गैलक्सी एस प्लस", "Galaxy S II", "एचटीसी डिजायर एचडी", "आकाशगंगा नेक्सस", " एक्सपीरिया मिनी एसटी 15i "," नेक्सस 5 "," गैलेक्सी आर ", और" गैलेक्सी नोट II "; एक टिप्पणी के साथ यह दावा करता है कि यह "गैलेक्सी नेक्सस" पर पूरी तरह से काम करता है।

संदर्भ: https://code.google.com/p/android/issues/detail?id=14341

इस स्रोत कोड के लिए आप देख रहे थे: समस्याग्रस्त हिस्सा https://android.googlesource.com/platform/frameworks/base/+/froyo-release/core/jni/android_hardware_Camera.cpp

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