【问题标题】:android - Cannot resolve method getSystemService issueandroid - 无法解决方法 getSystemService 问题
【发布时间】:2017-04-20 20:08:51
【问题描述】:

我遇到了有关 getSystemService 方法的问题,因为 Android Studio IDE 一直告诉我它无法解决此方法。据我所知,这可能来自于我的班级不包含活动的事实。我正在阅读有关 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;


  }



}

你能告诉我应该怎么做才能避免这件事吗?

谢谢!

【问题讨论】:

    标签: java android android-studio methods resolve


    【解决方案1】:

    您需要在Context 上调用getSystemService,因此,为什么它在您的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;
    
    
      }
    

    【讨论】:

    • 例如,它看起来如何?我是 android 新手,老实说,这是我的第一个项目
    • 非常感谢它非常适合!
    【解决方案2】:
    context!!.getSystemService(Service.WINDOW_SERVICE) as WindowManager;
    

    【讨论】:

      【解决方案3】:

      你应该使用getActivity() 来解决这个问题:

      getActivity().getSystemService(Context.AUDIO_SERVICE);
      

      这对我有用

      【讨论】:

        【解决方案4】:

        有时这是由于 android studio 无法获取特定文件而导致的,可以通过清理和重建项目来解决。 如果清洁和重建不起作用。 像这样使用 getSystemService。

        这对我有用:

        TelephonyManager telephonyManager = TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-07
          • 2018-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-13
          相关资源
          最近更新 更多