2016-12-06 135 views
1

我遇到了關於getSystemService方法的問題,因爲Android Studio IDE一直告訴我它不能解決此方法。據我所知,它可能會從事實中發現,我的班級不包含活動。我正在閱讀有關getSystemService問題的相關主題,但我根本找不到任何匹配的解決方案。android-無法解決方法getSystemService問題

我把我上面的代碼

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Matrix; 
import android.graphics.Rect; 
import android.hardware.Camera; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

private Camera mCamera; 
private CameraView mCameraView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 


@Override 
protected void onResume(){ 
    super.onResume(); 

    try{ 
     mCamera = Camera.open(1); 
     mCameraView = new CameraView(this, mCamera); 
     setContentView(mCameraView); 
    } catch (Exception e){ 
     finish(); 
    } 
} 

@Override 
protected void onPause(){ 
    if(mCamera != null){ 
     mCamera.release(); 
     mCamera = null; 
    } 
    super.onPause(); 


    } 

} 

以上的類的大膽的是一個我試圖找出

import android.content.Context; 
import android.hardware.Camera; 
import android.hardware.Camera.Parameters; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.Surface; 
import android.view.Display; 
import android.view.WindowManager; 
import java.io.IOException; 
import android.app.Activity; 
import java.util.List; 


public class CameraView extends SurfaceView implements SurfaceHolder.Callback{ 


private Camera mCamera; 
private View mView; 
private WindowManager display; 


public CameraView(Context context, Camera mCamera) { 
    super(context); 

    this.mCamera = mCamera; 
    mCamera.setDisplayOrientation(90); 

    SurfaceHolder holder = getHolder(); 
    holder.addCallback(this); 
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

} 


@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    try{ 
     mCamera.setPreviewDisplay(holder); 
     mCamera.startPreview(); 
    } catch (IOException e) { 
     Log.e("cameraPreview", "The failure of the camera settings"); 
    } 
} 


@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    Camera.Parameters params = mCamera.getParameters(); 
    List<Camera.Size> sizes = params.getSupportedPreviewSizes(); 
    Camera.Size optionalSize = getOptimalPreviewSize(sizes, width, height); 
    params.setPreviewSize(optionalSize.width, optionalSize.height); 
    mCamera.setParameters(params); 

    boolean isPreviewRunning = true; 

    if (isPreviewRunning) 
    { 
     mCamera.stopPreview(); 
    } 

    Parameters parameters = mCamera.getParameters(); 
    Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 

    if(display.getRotation() == Surface.ROTATION_0) 
    { 
     parameters.setPreviewSize(height, width); 
     mCamera.setDisplayOrientation(90); 
    } 

    if(display.getRotation() == Surface.ROTATION_90) 
    { 
     parameters.setPreviewSize(width, height); 
    } 

    if(display.getRotation() == Surface.ROTATION_180) 
    { 
     parameters.setPreviewSize(height, width); 
    } 

    if(display.getRotation() == Surface.ROTATION_270) 
    { 
     parameters.setPreviewSize(width, height); 
     mCamera.setDisplayOrientation(180); 
    } 

    mCamera.setParameters(parameters); 
    previewCamera(); 
} 

public void previewCamera() 
{ 
    try 
    { 
     mCamera.setPreviewDisplay(); 
     mCamera.startPreview(); 
     boolean isPreviewRunning = true; 
    } 
    catch(Exception e) 
    { 
     Log.d(APP_CLASS, "Cannot start preview", e); 
    } 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    mCamera.release(); 
    mCamera = null; 
} 

private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) { 

    final double ASPECT_TOLERANCE = 0.1; 
    double targetRatio=(double)h/w; 

    if (sizes == null) return null; 

    Camera.Size optimalSize = null; 
    double minDiff = Double.MAX_VALUE; 

    int targetHeight = h; 

    for (Camera.Size size : sizes) { 
     double ratio = (double) size.width/size.height; 
     if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; 
     if (Math.abs(size.height - targetHeight) < minDiff) { 
      optimalSize = size; 
      minDiff = Math.abs(size.height - targetHeight); 
     } 
    } 

    if (optimalSize == null) { 
     minDiff = Double.MAX_VALUE; 
     for (Camera.Size size : sizes) { 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 
    } 
    return optimalSize; 


    } 



} 

你能不能告訴我應該怎麼做避免這個問題?

謝謝!

回答

3

您需要致電getSystemServiceContext,因此,爲什麼它不起作用CameraView。您可以將已經傳遞的上下文作爲字段存儲並調用getSystemService。請參見下面的修改後的代碼:

import android.content.Context; 
import android.hardware.Camera; 
import android.hardware.Camera.Parameters; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.Surface; 
import android.view.Display; 
import android.view.WindowManager; 
import java.io.IOException; 
import android.app.Activity; 
import java.util.List; 


public class CameraView extends SurfaceView implements SurfaceHolder.Callback{ 


private Camera mCamera; 
private View mView; 
private WindowManager display; 
private Context mContext; 


public CameraView(Context context, Camera mCamera) { 
    super(context); 

    mContext = context; 

    this.mCamera = mCamera; 
    mCamera.setDisplayOrientation(90); 

    SurfaceHolder holder = getHolder(); 
    holder.addCallback(this); 
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

} 


@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    try{ 
     mCamera.setPreviewDisplay(holder); 
     mCamera.startPreview(); 
    } catch (IOException e) { 
     Log.e("cameraPreview", "The failure of the camera settings"); 
    } 
} 


@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    Camera.Parameters params = mCamera.getParameters(); 
    List<Camera.Size> sizes = params.getSupportedPreviewSizes(); 
    Camera.Size optionalSize = getOptimalPreviewSize(sizes, width, height); 
    params.setPreviewSize(optionalSize.width, optionalSize.height); 
    mCamera.setParameters(params); 

    boolean isPreviewRunning = true; 

    if (isPreviewRunning) 
    { 
     mCamera.stopPreview(); 
    } 

    Parameters parameters = mCamera.getParameters(); 
    Display display = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 

    if(display.getRotation() == Surface.ROTATION_0) 
    { 
     parameters.setPreviewSize(height, width); 
     mCamera.setDisplayOrientation(90); 
    } 

    if(display.getRotation() == Surface.ROTATION_90) 
    { 
     parameters.setPreviewSize(width, height); 
    } 

    if(display.getRotation() == Surface.ROTATION_180) 
    { 
     parameters.setPreviewSize(height, width); 
    } 

    if(display.getRotation() == Surface.ROTATION_270) 
    { 
     parameters.setPreviewSize(width, height); 
     mCamera.setDisplayOrientation(180); 
    } 

    mCamera.setParameters(parameters); 
    previewCamera(); 
} 

public void previewCamera() 
{ 
    try 
    { 
     mCamera.setPreviewDisplay(); 
     mCamera.startPreview(); 
     boolean isPreviewRunning = true; 
    } 
    catch(Exception e) 
    { 
     Log.d(APP_CLASS, "Cannot start preview", e); 
    } 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    mCamera.release(); 
    mCamera = null; 
} 

private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) { 

    final double ASPECT_TOLERANCE = 0.1; 
    double targetRatio=(double)h/w; 

    if (sizes == null) return null; 

    Camera.Size optimalSize = null; 
    double minDiff = Double.MAX_VALUE; 

    int targetHeight = h; 

    for (Camera.Size size : sizes) { 
     double ratio = (double) size.width/size.height; 
     if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; 
     if (Math.abs(size.height - targetHeight) < minDiff) { 
      optimalSize = size; 
      minDiff = Math.abs(size.height - targetHeight); 
     } 
    } 

    if (optimalSize == null) { 
     minDiff = Double.MAX_VALUE; 
     for (Camera.Size size : sizes) { 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 
    } 
    return optimalSize; 


    } 
+0

會如何看待像一個例子嗎?我是Android新手,這是我第一個誠實的項目 – ArturS

+0

非常感謝它,它非常適合輝煌! – ArturS