java将意图从PreferenceActivity传递到LWP服务/电影类
我无法将用户选择的图像/gif传送到主LWP服务。我首先通过这个PreferenceActivity提示用户选择gif(其中一些是从这里的成员和Vogella的教程中借用的)
public class GifPreference extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener{
@SuppressWarnings("deprecation")
//SharedPreferences SHARED_PREF;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getPreferenceManager().setSharedPreferencesName("custom_gif");
addPreferencesFromResource(R.xml.prefsettings);
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(
this);
getPreferenceManager().findPreference("custom_gif").setOnPreferenceClickListener(new OnPreferenceClickListener()
{
public boolean onPreferenceClick(Preference preference)
{
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
Toast.makeText(getBaseContext(), "Select a GIF - " + (width) + " x " + height , Toast.LENGTH_LONG).show();
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, 安卓.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, 1);
return true;
}
});
}
public String getRealPathFromURI(Uri contentUri) {
String [] proj={MediaColumns.DATA};
Cursor cursor = managedQuery( contentUri,
proj, // Which columns to return
null, // WHERE clause; which rows to return (all rows)
null, // WHERE clause selection arguments (none)
null); // Order-by clause (ascending by name)
int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1) {
if (resultCode == Activity.RESULT_OK) {
Uri selectedImage = data.getData();
String RealPath;
SharedPreferences customSharedPreference = getSharedPreferences("custom_gif", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = customSharedPreference.edit ();
RealPath = getRealPathFromURI (selectedImage);
editor.putString("custom_gif", RealPath);
editor.commit();
ComponentName component = new ComponentName(getPackageName(), getPackageName() + ".LWPEngine");
Intent intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, component);
startActivity(intent);
}}
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onDestroy() {
getPreferenceManager().getSharedPreferences().
unregisterOnSharedPreferenceChangeListener(this);
super.onDestroy();
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
}
}
这是LWPS的主要服务:
public class LWPEngine extends WallpaperService {
private static int RESULT_LOAD_IMAGE1 = 1;
static final Handler mGIFHandler = new Handler();
//public String gifBG;
public Engine onCreateEngine() {
try {
LWPEngine.GIFEngine var1 = new LWPEngine.GIFEngine();
return var1;
} catch (IOException var3) {
return null;
}
}
class GIFEngine extends Engine {
private LWPEngineHelper lWPEngineHelper = new LWPEngineHelper(LWPEngine.this.getApplicationContext(), LWPEngine.this.getResources());
private final Movie mGIF;
private final int mGIFDuration;
private final int mGIFHeight;
private final Runnable mGIFRunnable;
private final int mGIFWidth;
private String mImageScale = "Stretch to screen";
private long mStart;
private int mWhen;
@SuppressWarnings("unused")
public GIFEngine() throws IOException {
//decodes and plays the gif - if no gif is found, throw an error.
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(LWPEngine.this);
String gifBG = prefs.getString("custom_gif", "This file does not work");
InputStream var2 = new FileInputStream(gifBG);
//InputStream var2 = LWPEngine.this.getResources().openRawResource(R.drawable.dogegif);
if(var2 != null) {
try {
this.mGIF = Movie.decodeStream(var2);
this.mGIFDuration = this.mGIF.duration();
} finally {
var2.close();
}
this.mGIFWidth = this.mGIF.width();
this.mGIFHeight = this.mGIF.height();
this.mWhen = -1;
this.mGIFRunnable = new Runnable() {
public void run() {
GIFEngine.this.animGIF();
}
};
} else {
throw new IOException("Can't open GIF");
}
}
void animGIF()
{
tick();
SurfaceHolder localSurfaceHolder = getSurfaceHolder();
Canvas localCanvas = null;
/* try
{*/
localCanvas = localSurfaceHolder.lockCanvas();
if (localCanvas != null)
animGIFDraw(localCanvas);
if (localCanvas != null)
localSurfaceHolder.unlockCanvasAndPost(localCanvas);
LWPEngine.mGIFHandler.removeCallbacks(this.mGIFRunnable);
if (isVisible())
LWPEngine.mGIFHandler.postDelayed(this.mGIFRunnable, 40L);
return;
/* }
finally
{
if (localCanvas != null)
localSurfaceHolder.unlockCanvasAndPost(localCanvas);
}*/
}
void animGIFDraw(Canvas var1) {
this.lWPEngineHelper.setBackground(var1);
var1.save();
PointF var3 = this.lWPEngineHelper.getCanvasScale(this.mImageScale, this.mGIFWidth, this.mGIFHeight);
var1.scale(var3.x, var3.y);
this.mGIF.setTime(this.mWhen);
Point var5 = this.lWPEngineHelper.getImagePos(var3, this.mGIFWidth, this.mGIFHeight);
this.mGIF.draw(var1, (float)var5.x, (float)var5.y);
var1.restore();
}
public void onDestroy() {
super.onDestroy();
LWPEngine.mGIFHandler.removeCallbacks(this.mGIFRunnable);
}
public void onOffsetsChanged(float var1, float var2, float var3, float var4, int var5, int var6) {
super.onOffsetsChanged(var1, var2, var3, var4, var5, var6);
this.animGIF();
}
public void onSurfaceChanged(SurfaceHolder var1, int var2, int var3, int var4) {
super.onSurfaceChanged(var1, var2, var3, var4);
this.animGIF();
}
public void onVisibilityChanged(boolean var1) {
super.onVisibilityChanged(var1);
if(var1) {
this.animGIF();
} else {
LWPEngine.mGIFHandler.removeCallbacks(this.mGIFRunnable);
}
}
public void onSharedPreferenceChanged(SharedPreferences prefs,
String key) {
String gifBG = prefs.getString("custom_gif", "This file does not work");
//gifBG = prefs.getString("custom_gif", "Bad Image");
}
void tick() {
if((long)this.mWhen == -1L) {
this.mWhen = 0;
this.mStart = SystemClock.uptimeMillis();
} else {
if(this.mGIFDuration!=0) {
this.mWhen = (int)((SystemClock.uptimeMillis() - this.mStart) % (long)this.mGIFDuration);
}
}
}
}
}
我一直收到一个空指针异常——我猜是因为那里什么都没有——所以我显然没有正确设置共享首选项——或者是inputstream
将用户选择的图像发送到主LWPservice的输入流中的任何帮助都将非常有用
**编辑我应该提到,在选择GIF后启动LWPService之前,一切正常。当加载lwp时,我得到了错误。在drawable中使用静态GIF确实有效
提前谢谢, 马克
# 1 楼答案
我想出了答案,以防有人好奇
需要:
在我的SharedReference课程中也需要改变这一点
GetSharedReference需要上下文,而我之前的做法是限制SharedReference方法的“全局”功能的范围
我希望这能帮助人们