2015-04-06 109 views
1

我無法讓HTC M8後置相機進行自動對焦。硬件方面沒有任何問題,因爲相機會完美對焦(鏡頭上沒有灰塵)。HTC One(M8)FOCUS_MODE_CONTINUOUS_PICTURE無法正常工作

最初我以爲我的代碼可能有問題,但後來我嘗試了Commonsware的相機app/library,我得到了相同的結果 - 從一開始就模糊不清的圖像,無法集中精力。 我試過Nexus 4和Galaxy 3上的相同代碼,它們完美地工作。我也對M8進行了params.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);測試,它返回true。

我也試過mCamera.autoFocus(...),它也沒有工作,所以我有點想法。

前置攝像頭也可用於Commonsware相機的自動對焦。 Instagram的應用程序也可以正常工作,所以他們正在做一些特殊的事情來實現它的功能。

編輯剛剛在朋友HTC One Dual Sim上嘗試了相同的代碼,焦點工作正常。我也用M8進行了一次工廠重置,但它仍然不起作用。

回答

-1

嗨我有與HTC M8自動對焦相同的問題。我的代碼在HTC m7和其他設備上正常工作。

我修改了代碼如下

import android.hardware.Camera; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.hardware.Camera.AutoFocusCallback; 
import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.Window; 
import android.view.WindowManager; 

public class Main extends Activity implements SurfaceHolder.Callback, SensorEventListener, AutoFocusCallback { 
Camera mCamera; 
SurfaceView mPreview; 
Sensor mAccelerometer; 
SensorManager mSensorManager; 

float motionX = 0; 
float motionY = 0; 
float motionZ = 0; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN 
      | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    setContentView(R.layout.main); 

    mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 

    mPreview = (SurfaceView)findViewById(R.id.preview); 
    mPreview.getHolder().addCallback(this); 
    mPreview.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

public void onResume() { 
    Log.d("System","onResume"); 
    super.onResume(); 
    mCamera = Camera.open(); 
    mSensorManager.registerListener(this, mAccelerometer 
      , SensorManager.SENSOR_DELAY_NORMAL); 
} 

public void onPause() { 
    Log.d("System","onPause"); 
    super.onPause(); 
    mCamera.release(); 
    mSensorManager.unregisterListener(this, mAccelerometer); 
} 

public void onAccuracyChanged(Sensor arg0, int arg1) { } 

public void onSensorChanged(SensorEvent event) { 
    if(Math.abs(event.values[0] - motionX) > 0.2 
     || Math.abs(event.values[1] - motionY) > 0.2 
     || Math.abs(event.values[2] - motionZ) > 0.2) { 
     Log.d("Camera System", "Refocus"); 
     try { 
      mCamera.autoFocus(this); 
     } catch (RuntimeException e) { } 
    } 

    motionX = event.values[0]; 
    motionY = event.values[1]; 
    motionZ = event.values[2]; 
} 

public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
    Log.d("CameraSystem","surfaceChanged"); 
    Camera.Parameters params = mCamera.getParameters(); 
    List<Camera.Size> previewSize = params.getSupportedPreviewSizes(); 
    List<Camera.Size> pictureSize = params.getSupportedPictureSizes(); 
    params.setPictureSize(pictureSize.get(0).width, pictureSize.get(0).height); 
    params.setPreviewSize(previewSize.get(0).width, previewSize.get(0).height); 
    params.setJpegQuality(100); 
    mCamera.setParameters(params); 

    try { 
     mCamera.setPreviewDisplay(mPreview.getHolder()); 
     mCamera.startPreview(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void surfaceCreated(SurfaceHolder arg0) { } 

public void surfaceDestroyed(SurfaceHolder arg0) { } 

public void onAutoFocus(boolean success, Camera camera) { 
    Log.d("CameraSystem","onAutoFocus"); 
} 
} 

和XML如下所示:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<SurfaceView 
    android:id="@+id/preview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 

</RelativeLayout> 

希望這有助於你