0

このメソッドを作成して、URLを取得し、そのURLからPNGファイルを取得して圧縮し、SDカードに保存します。次に、メソッドはそのファイルを取得し、ライブ壁紙のスプライトとして使用します。

        try
        {
            URL url = new URL(
                    "http://www.google.com/someimage.png");
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            webBitmap = BitmapFactory.decodeStream(input);

            f = new File(Environment.getExternalStorageDirectory()
                    .getAbsolutePath() + "/webbitmap.png");

            // Save the bitmap to the sdcard.
            String filepath = Environment.getExternalStorageDirectory()
                    .getAbsolutePath();
            FileOutputStream fos = new FileOutputStream(filepath + "/"
                    + "webbitmap.png");
            webBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
            fos.flush();
            fos.close();

            if (f.exists())
            {

                BitmapTextureAtlas texture = new BitmapTextureAtlas(512,
                        1024, TextureOptions.BILINEAR);

                FileBitmapTextureAtlasSource fileTextureSource = new FileBitmapTextureAtlasSource(
                        f);
                TextureRegion textureRegion = TextureRegionFactory
                        .createFromSource(texture, fileTextureSource, 0, 0,
                                true);
                this.mEngine.getTextureManager().loadTexture(texture);

                webSprite = new Sprite(512, 1024, 320, 634,
                        textureRegion);
                webSprite.setPosition(
                        mCamera.getCenterX()
                                - webSprite.getRotationCenterX(),
                        mCamera.getCenterY()
                                - webSprite.getRotationCenterY());
                scene.attachChild(webSprite);
            }
            else
            {
                scene.attachChild(GTMessage);

            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        catch(IllegalArgumentException e)
        {
            e.printStackTrace();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

ほとんどの場合、それはうまく機能しています。ただし、このメソッドを実行すると、次の行でIllegalArgumentException(ビットマップの読み込みエラー)が発生することがあります。

webBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);

スタックトレースは次のとおりです。

01-24 12:50:52.739: E/AndEngine(19411): Error loading: FileBitmapTextureAtlasSource(/mnt/sdcard/webbitmap.png)
01-24 12:50:52.739: E/AndEngine(19411): java.lang.IllegalArgumentException: FileBitmapTextureAtlasSource: FileBitmapTextureAtlasSource(/mnt/sdcard/webbitmap.png) returned a null Bitmap.
01-24 12:50:52.739: E/AndEngine(19411):     at org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas.writeTextureToHardware(BitmapTextureAtlas.java:159)
01-24 12:50:52.739: E/AndEngine(19411):     at org.anddev.andengine.opengl.texture.Texture.loadToHardware(Texture.java:116)
01-24 12:50:52.739: E/AndEngine(19411):     at org.anddev.andengine.opengl.texture.TextureManager.updateTextures(TextureManager.java:146)
01-24 12:50:52.739: E/AndEngine(19411):     at org.anddev.andengine.engine.Engine.onDrawFrame(Engine.java:503)
01-24 12:50:52.739: E/AndEngine(19411):     at org.anddev.andengine.opengl.view.RenderSurfaceView$Renderer.onDrawFrame(RenderSurfaceView.java:154)
01-24 12:50:52.739: E/AndEngine(19411):     at com.*****.*****.GLThread.guardedRun(GLThread.java:236)
01-24 12:50:52.739: E/AndEngine(19411):     at com.*****.*****.GLThread.run(GLThread.java:95)

とにかく、少なくともこの力の接近を防ぐ方法はありますか?または、それを永久に修正する方法があれば、それは理想的です。

ありがとうございました

//編集-私の解決策

例外がスローされる場所を調べたところ、BitmapTextureAtlas.javaクラスで例外がスローされていることがわかりました。具体的にはこの行:

if(bitmap == null) 
{
  throw new IllegalArgumentException(bitmapTextureSource.getClass().getSimpleName() + ": " + bitmapTextureSource.toString() + " returned a null Bitmap.");
}

ビットマップが実際にはnullではなく、単に「破損」しているように見えることがわかりました。これは、ファイルがすでに存在し、上書き中だったためです。これが私が問題を修正した方法です:

f = new File(Environment.getExternalStorageDirectory()
                        .getAbsolutePath() + "/webbitmap.png");
if (f.exists())
{
   f.delete();
}

エラーは表示されなくなりました。

4

2 に答える 2

1

このスニペットを持つクラスでthrowsIllegalArgumentExceptionを使用できます。

詳細については、こちらをご覧ください http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/IllegalArgumentException.html

于 2013-01-24T19:18:27.630 に答える
1

私の推測では、本当の問題はあなたのメモリ管理です。BitmapFactoryを使用してビットマップをロードすると 、さまざまな理由でnull値を取得できます。画像が正しい形式であることが保証されている場合でも、使用可能なメモリを超えるとnull値が取得される可能性があります。

logcatを調べて、フォーマットが正しくないか、メモリの問題であるかを確認できます。

于 2013-01-24T19:20:14.777 に答える