1

我在 Google Play 上有一个应用程序,其中包含仍然使用图库(http://developer.android.com/reference/android/widget/Gallery.html,是的,它是一个旧应用程序)的壁纸(它是一个壁纸选择器)。我正在尝试实现 apk 扩展文件以打破 50MB 的限制。

现在应用内下载器和从 GP 下载的 .obb 运行良好。我可以在 /Android/obb 中找到它。我仍然无法从 .obb 文件中准备好壁纸。我尝试了 APK 扩展 Zip 库,但我不知道如何将它与画廊一起使用...

这是我的 wallpaper.java 文件:

public class wallpaper extends Activity implements AdapterView.OnItemSelectedListener,
    OnClickListener {

private Gallery mGallery;
private ImageView mImageView;
private TextView mInfoView;
private boolean mIsWallpaperSet;

private Bitmap mBitmap;

private ArrayList<Integer> mThumbs;
private ArrayList<Integer> mImages;
private WallpaperLoader mLoader;

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    // Start wallpaper app
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    findWallpapers();

    setContentView(R.layout.wallpaper_chooser);

    mGallery = (Gallery) findViewById(R.id.gallery);
    mGallery.setAdapter(new ImageAdapter(this));
    mGallery.setOnItemSelectedListener(this);
    mGallery.setCallbackDuringFling(false);

    findViewById(R.id.set).setOnClickListener(this);

    mImageView = (ImageView) findViewById(R.id.wallpaper);
    mInfoView = (TextView) findViewById(R.id.info);
}

private void findWallpapers() {
    mThumbs = new ArrayList<Integer>(24);
    mImages = new ArrayList<Integer>(24);

    final Resources resources = getResources();
    final String packageName = getApplication().getPackageName();

    addWallpapers(resources, packageName, R.array.wallpapers);
    addWallpapers(resources, packageName, R.array.extra_wallpapers);
}

private void addWallpapers(Resources resources, String packageName, int list) {
    final String[] extras = resources.getStringArray(list);
    for (String extra : extras) {
        int res = resources.getIdentifier(extra, "drawable", packageName);
        if (res != 0) {
            final int thumbRes = resources.getIdentifier(extra + "_small",
                    "drawable", packageName);

            if (thumbRes != 0) {
                mThumbs.add(thumbRes);
                mImages.add(res);
            }
        }
    }
}

@Override
protected void onResume() {
    super.onResume();
    mIsWallpaperSet = false;
}

@Override
protected void onDestroy() {
    super.onDestroy();

    if (mLoader != null && mLoader.getStatus() != WallpaperLoader.Status.FINISHED) {
        mLoader.cancel(true);
        mLoader = null;
    }
}

public void onItemSelected(AdapterView parent, View v, int position, long id) {
    if (mLoader != null && mLoader.getStatus() != WallpaperLoader.Status.FINISHED) {
        mLoader.cancel();
    }
    mLoader = (WallpaperLoader) new WallpaperLoader().execute(position);
}

/*
 * When using touch if you tap an image it triggers both the onItemClick and
 * the onTouchEvent causing the wallpaper to be set twice. Ensure we only
 * set the wallpaper once.
 */
private void selectWallpaper(int position) {
    if (mIsWallpaperSet) {
        return;
    }

    mIsWallpaperSet = true;
    try {
        InputStream stream = getResources().openRawResource(mImages.get(position));
        setWallpaper(stream);
        setResult(RESULT_OK);
        finish();
    } catch (IOException e) {
        Log.e("Paperless System", "Failed to set wallpaper: " + e);
    }
}

public void onNothingSelected(AdapterView parent) {
}

private class ImageAdapter extends BaseAdapter {
    private LayoutInflater mLayoutInflater;

    ImageAdapter(wallpaper context) {
        mLayoutInflater = context.getLayoutInflater();
    }

    public int getCount() {
        return mThumbs.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView image;

        if (convertView == null) {
            image = (ImageView) mLayoutInflater.inflate(R.layout.wallpaper_item, parent, false);
        } else {
            image = (ImageView) convertView;
        }

        int thumbRes = mThumbs.get(position);
        image.setImageResource(thumbRes);
        Drawable thumbDrawable = image.getDrawable();
        if (thumbDrawable != null) {
            thumbDrawable.setDither(true);
        } else {
            Log.e("Paperless System", String.format(
                "Error decoding thumbnail resId=%d for wallpaper #%d",
                thumbRes, position));
        }
        return image;
    }
}

public void onClick(View v) {
    selectWallpaper(mGallery.getSelectedItemPosition());
}

class WallpaperLoader extends AsyncTask<Integer, Void, Bitmap> {
    BitmapFactory.Options mOptions;

    WallpaperLoader() {
        mOptions = new BitmapFactory.Options();
        mOptions.inDither = false;
        mOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;            
    }

    protected Bitmap doInBackground(Integer... params) {
        if (isCancelled()) return null;
        try {
            return BitmapFactory.decodeResource(getResources(),
                    mImages.get(params[0]), mOptions);
        } catch (OutOfMemoryError e) {
            return null;
        }            
    }

    @Override
    protected void onPostExecute(Bitmap b) {
        if (b == null) return;

        if (!isCancelled() && !mOptions.mCancel) {
            // Help the GC
            if (mBitmap != null) {
                mBitmap.recycle();
            }

            mInfoView.setText(getResources().getStringArray(R.array.info)[mGallery.getSelectedItemPosition()]);

            final ImageView view = mImageView;
            view.setImageBitmap(b);

            mBitmap = b;

            final Drawable drawable = view.getDrawable();
            drawable.setFilterBitmap(true);
            drawable.setDither(true);

            view.postInvalidate();

            mLoader = null;
        } else {
           b.recycle(); 
        }
    }

    void cancel() {
        mOptions.requestCancelDecode();
        super.cancel(true);
    }
}

壁纸在 res/values/wallpapers.xml 中定义:

<resources>
<string-array name="wallpapers" translatable="false">
    <item>wallpaper1</item>
    <item>wallpaper2</item>
    <item>wallpaper3</item>
    [...]
    </string-array>

<string-array name="info" translatable="false">
    <item>wallpaper1 description</item>
    <item>wallpaper2 description</item>
    <item>wallpaper3 description</item>
    [...]
</string-array>

如何将我的壁纸补丁从 /res/drawable 更改为 /obb/com.example.app/main.8.com.example.app.obb ?

在此先感谢您的帮助!

4

1 回答 1

0

首先在此处阅读 APK 扩展文件:http: //developer.android.com/google/play/expansion-files.html 然后,在此处阅读有关使用图库小部件的更多信息:http: //developer.android.com/reference/android /widget/Gallery.html

最后,考虑使用 ViewPager,从这里引用:http: //developer.android.com/training/implementing-navigation/lateral.html

我不确定你是否应该问这样的问题,如果我错了,请纠正我..

于 2015-01-09T22:31:37.423 回答