このメソッドを作成して、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();
}
エラーは表示されなくなりました。