- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我遇到了有关 getSystemService 方法的问题,因为 Android Studio IDE 一直告诉我它无法解析此方法。据我所知,我的类(class)不包含 Activity 这一事实可能会得出结论。我正在阅读有关 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;
}
}
你能告诉我应该怎么做才能避免这件事吗?
谢谢!
最佳答案
您需要在 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;
}
关于java - android - 无法解决方法 getSystemService 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40991083/
我正在尝试编写一个服务来获取 Gear Live 上的心率,按照这里的问题 Get Heart Rate from "Sensor" Samsung Gear Live 如果我把这部分放在 L
所以我跟随this tutorial ,我被困住了。在 Eclipse 中,我收到一条错误消息,指出“UserItemAdapter 类型未定义方法 getSystemService(String)”
在 Android eclipse 中当我想使用非静态方法“getSystemService”时,它显示错误: Cannot make a static reference to the non-st
我已按照本教程获取我的 ListView 填充数据 -- http://android.amberfog.com/?p=296 . 但它只有在我像教程那样子类化我的自定义列表适配器 (MyCustom
如果我连接到 WLAN,以下行将不会导致空指针异常: ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.C
我遵循了如何制作下载 .pdf 文件的应用程序的教程。 代码如下: protected void onCreate(Bundle savedInstanceState) { super.onC
我需要在自定义微调器中使用“getSystemService”,所以自定义微调器会扩展 getSystemService Will Use To Copy Text To Clip Board is
我试图将 onClickListener 添加到 RecyclerView 中的一个按钮,该按钮将复制一个字符串,但它说 getSystemService(CLIPBOARD_SERVICE) 不可用
乍一看下面的代码 mLocationManager对象在 onCreate(...) 之后应该超出范围已完成,预期的行为是 onLocationChanged在对象被垃圾回收之前,永远不会被调用或调用
我想测试一些关于USB设备的东西,我尝试编写一个小程序,我确信这是错误的,但这不是这个问题的重点。我确信我的导入没问题,但 Android Studio 拒绝构建此类,并出现有关 GetSystemS
现在已经为此苦苦挣扎了很长一段时间,足以让此处的用户实际上在堆栈上溢出。我们正在开发一个 android 应用程序,我想测试一个 Activity 类中的方法。我以前做过一些单元测试,但从来没有针对
此方法是否检查实际连接到互联网或设备是否连接到无线网络。 我很想知道,如果设备已连接到路由器,但路由器未连接到网络或已关闭,它是否会返回 true。 我的代码:- private boolean is
当我使用“getSystemService”时,我遇到了这个错误The method getSystemService(String) is undefined for the type WebApp
所以我现在只是试图在我的 getView 函数中膨胀一个 View ,而 getContext() 出于某种原因说它是未定义的.. package com.MTSUAndroid; import co
Context.getSystemService 的文档州 Returns: The service or null if the name does not exist. 接受的名称列表列为 AC
getSystemService 的文档建议不要在各种不同的上下文之间共享服务对象。 对于单个上下文,是通过将服务对象分配给 onCreate() 中的实例字段来缓存服务对象,还是应该在使用时获取?惯
context.getSystemService() 是一个昂贵的调用吗? 即我已经构建了一个小 http 网络库(我知道还有其他可用的 http 网络库),它使用 ConnectivityManag
我遇到了这个问题:getSystemService 定义在 Context 类中,所以我假设它在 context.getSystemService 时被调用。我无法理解以下代码,其中 Broadcas
我怎样才能像下面的代码那样在 fragment 类中使用 getSystemService final EditText input = new EditText(getContext()); Inp
我的问题是,在我的 MainActivity 的 onCreate() 方法中,我正在创建新的 Thread 对象,我想将对 this Activity 的引用传递给该对象,然后在该线程中使用它来调用
我是一名优秀的程序员,十分优秀!