有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    我想出了答案,以防有人好奇

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(LWPEngine.this);
    
                String gifBG = prefs.getString("custom_gif", "This file does not work");
    

    需要:

    SharedPreferences prefs = getApplicationContext().getSharedPreferences("custom_gif",MODE_PRIVATE);
    
                String gifBG = prefs.getString("custom_gif", "This file does not work");
    

    在我的SharedReference课程中也需要改变这一点

    GetSharedReference需要上下文,而我之前的做法是限制SharedReference方法的“全局”功能的范围

    我希望这能帮助人们