Вызов акселерометра от WallpaperService
Я получил этот класс акселерометра, который содержит значения акселерометра, и я могу получить к ним доступ из любого другого класса, когда захочу. Обычно я бы создал новый объект Accelerometer accelerometer = new Accelerometer(this);
но когда я внутри WallpaperService
это не позволяет мне использовать this
в качестве параметра.
Вот класс Акклерометр:
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
public class Accelero implements SensorEventListener {
private float xAxis;
private float yAxis;
private float zAxis;
SensorManager manager;
Sensor accelerometer;
Activity activity;
public Accelero(Activity activity) {
this.activity = activity;
manager = (SensorManager) this.activity.getSystemService(Context.SENSOR_SERVICE);
accelerometer = manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);
}
public float getX(){
return this.xAxis;
}
public float getY(){
return this.yAxis;
}
public float getZ(){
return this.zAxis;
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
public void onSensorChanged(SensorEvent event) {
xAxis = event.values[0];
yAxis = event.values[1];
zAxis = event.values[2];
}
}
например, я попытался получить доступ к нему из примера кода, который поставляется с SDK, CubeWallpaper
import com.example.android.livecubes.R;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.os.SystemClock;
import android.service.wallpaper.WallpaperService;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
/*
* This animated wallpaper draws a rotating wireframe cube.
*/
public class CubeWallpaper1 extends WallpaperService {
private final Handler mHandler = new Handler();
Accelero acc;
@Override
public void onCreate() {
super.onCreate();
acc = new Accelero(this);
}
@Override
public void onDestroy() {
super.onDestroy();
}
... // skipped to keep post short.
}
1 ответ
Вы должны пройти Activity object
к классу акселерометра, а не WallpaperService object
,
Ваши варианты для инициализации объекта Accelerometer:
1) Сделайте это прямо из вашего класса активности в методе onCreate():
Accelerometer accelerometer = new Accelerometer(this);
2) Или вы можете сделать это из вашего класса WallpaperService, но вам потребуется ссылка на ваш класс активности.
Activity foo;
Accelerometer accelerometer = new Accelerometer(foo);
Вы можете создать метод в вашем WallpaperService, чтобы передать ссылку на объект действия в объект WallpaperService.
public void setActivity(Activity foo) {
this.foo = foo;
}
Надеюсь, это поможет!
Обновить:
Вот некоторый код, чтобы сделать второй вариант более понятным:
public class YourWallPaperService extends WallpaperService {
Activity foo;
// I'm guessing you create a WallpaperService object in your activity code? If so, call this method on that object with a parameter "this"
public void setActivity(Activity foo) {
this.foo = foo;
}
}