0

私は主にこれを使ってAndroidで最初のライブ壁紙の作業を開始しました: http ://www.vogella.com/articles/AndroidLiveWallpaper/article.html 。問題は、壁紙を選択できる画面に壁紙が表示されないことです。

Eclipseから壁紙を開始し、アンインストールしてエクスポートした壁紙を再インストールしましたが、スマートフォンでもエミュレーターでも機能しません。

マニフェスト:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.zdev.wallpaper.cpubeat"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="10" />
<uses-feature android:name="android.software.live_wallpaper" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >

<service 
    android:name="de.zdev.wallpaper.CPUBeatService"
    android:label="@string/app_name"
    android:permission="android.permission.BIND_WALLPAPER" >

    <intent-filter>
        <action android:name="android.service.wallpaper.WallpaperService" />
    </intent-filter>

    <meta-data
        android:name="android.service.wallpaper"
        android:resource="@xml/wallpaper" />

</service>

</application>

「wallpaper.xml」(問題はここにあるとは思わない):

<?xml version="1.0" encoding="utf-8"?>
<Wallpaper
xmlns:android="http://schemas.android.com/apk/res/android"
android:thumbnail="@drawable/ic_launcher"
android:description="@string/description" />

そして最後に私の「CPUBeatService.java」:

package de.zdev.wallpaper.cpubeat;

import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Handler;
import android.service.wallpaper.WallpaperService;
import android.service.wallpaper.WallpaperService.Engine;
import android.view.SurfaceHolder;

public class CPUBeatService extends WallpaperService {
    @Override
    public Engine onCreateEngine(){
        return new CPUBeatEngine();
    }

    private class CPUBeatEngine extends Engine{

        private final Handler handler = new Handler();
        private boolean visible = true;
        private int width, height;
        private final Runnable drawRunnable = new Runnable(){
            public void run(){
                doDraw();
            }
        };

        public CPUBeatEngine(){
            handler.post(drawRunnable);
        }

        private void draw(Canvas c){
            c.drawColor(Color.GREEN);
        }

        @Override
        public void onVisibilityChanged(boolean v){
            visible = v;
            if(visible) handler.post(drawRunnable);
            else handler.removeCallbacks(drawRunnable);
        }

        @Override
        public void onSurfaceDestroyed(SurfaceHolder holder){
            super.onSurfaceDestroyed(holder);
            visible = false;
            handler.removeCallbacks(drawRunnable);
        }

        @Override
        public void onSurfaceChanged(SurfaceHolder holder, int format, int w, int h){
            super.onSurfaceChanged(holder, format, w, h);
            width = w;
            height = h;
        }

        private void doDraw(){
            SurfaceHolder holder = getSurfaceHolder();
            Canvas c = null;
            try {
                c = holder.lockCanvas();
                if (c != null) {
                    //do the real drawing now
                    draw(c);
                }
            } finally {
                if (c != null)
                    holder.unlockCanvasAndPost(c);
            }
            handler.removeCallbacks(drawRunnable);
            if (visible) {
                handler.postDelayed(drawRunnable, 5000);
            }
        }

    }
}

助けてくれる人に感謝します。

4

1 に答える 1

1

さて、数ヶ月後、私はこれに再び取り組むことにしました。私は間違いを見つけました...少なくとも私はそう思います。Wallpaper.xmlが正しくありませんでした、これは正しいです:

<?xml version="1.0" encoding="utf-8"?>
<wallpaper
xmlns:android="http://schemas.android.com/apk/res/android"
android:thumbnail="@drawable/ic_launcher"
android:description="@string/description" />

注意:<wallpaper小文字で書かれています!それが問題だったと思います。:)

于 2013-05-19T18:11:33.917 に答える