2016-12-06 23 views
1

getSystemServiceメソッドに関する問題が発生しました。これは、AndroidスタジオIDEがこのメソッドを解決できないことを伝え続けているためです。私が読んだ限りでは、私のクラスにはアクティビティが含まれていないという事実から出てくるかもしれません。 getSystemServiceの問題に関する関連トピックを読んでいましたが、一致する解決策がまったく見つかりませんでした。アンドロイド - メソッドgetSystemServiceを解決できません。

私は上記のクラスの大胆な1あなたは、おそらくそれが行われるべきかを教えてもらえ、私は

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; 


    } 



} 

を把握しようとしているものです

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(); 


    } 

} 
の上に私のコードを配置しますこの問題を避けるために?

ありがとうございます!

答えて

3

ContextgetSystemServiceに電話する必要があります。なぜ、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

どのようにそれは例えば次のようになりますか?私はアンドロイドで新しく、それは正直である私の最初のプロジェクトです – ArturS

+0

ありがとう、それは華麗に合う! – ArturS

関連する問題