3

うまくいかないように見えるアプリケーションでクラッシュが発生しました。

私はそのようなリソースからビットマップを取得します。

Bitmap bmp1 = BitmapFactory.decodeResource(getResources(), R.drawable.map_distance_tag);

このビットマップからビットマップを作成する場合、これはごく少数のデバイスで問題があるようです。例えば...

Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());

クラスのオンライン468をNullPointerException作成するときと、ソースビットマップから新しいビットマップの密度スケールを設定するときを調べました。BitmapBitmap

// The new bitmap was created from a known bitmap source so assume that
467        // they use the same density scale
468        bitmap.setDensityScale(source.getDensityScale());

今は問題を再現できないようですが、元のビットマップでgetWidth()が呼び出されたときに例外が発生しないという事実は、ソースがnullではないことを示しています。

これがスタックトレース全体です。

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.app/com.my.app.recording.TrackingActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.graphics.Bitmap.createBitmap(Bitmap.java:468)
at com.my.app.maps.MapFragment.createTabOverlay(MapFragment.java:663)
at com.my.app.maps.MapFragment.addMarkersForToolType(MapFragment.java:474)
at com.my.app.maps.MapFragment.onActivityCreated(MapFragment.java:405)
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1468)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:551)
at com.my.app.recording.TrackingActivity.onStart(TrackingActivity.java:272)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
at android.app.Activity.performStart(Activity.java:3781)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2636)
... 11 more

私のアイデア

さまざまな画面密度のさまざまなビットマップを含めないことと関係があるのでしょうか?提供されるすべてのビットマップは、mdpi画面用です。

BackStackRecordもあることに気づきました。ユーザーが押し戻すと、これがクラッシュする可能性がありますか?

前もって感謝します

4

5 に答える 5

4

あなたが指摘するソースBitmap.java:468はAndroid1.5からのものであり、おそらくあなたの問題ではありません。

v1.5 Bitmap.java:468

bitmap.setDensityScale(source.getDensityScale());

v1.6-v2.2 Bitmap.java:468

Bitmap bm = nativeCreate(null, 0, width, width, height, config.nativeInt, true);

2.2より新しいものの468行目は、javadocブロックの一部であるか、関連のない関数であるため、トラブルシューティングしようとしているバージョンではなく、1.6〜2.2バージョンを見ていると思います。

私が見るその行の唯一のものは、実際にnullになる可能性がありconfigます。コードでgetConfig()は、現在のビットマップオブジェクトからそれを取得するために使用します。そのためのドキュメントは次のとおりです。

public final Bitmap.Config getConfig()

APIレベル1で追加

ビットマップの内部構成がパブリック形式の1つである場合は、その構成を返します。そうでない場合は、nullを返します。

したがって、おそらく「パブリック」形式が見つからず、nullが返されます。これは、に渡されcreateBitmap()、コードを爆破します。

のように常に静的設定を使用するかBitmap.Config.ARGB_8888getConfig()前の行でを実行してnullチェックを行うことができます。nullの場合は、今述べたようなフォールバック構成に移動します。

于 2013-01-29T02:10:12.343 に答える
1

yourSelectedImageBitmap = BitmapFactory.decodeFile(filePath、options);

    if (yourSelectedImageBitmap != null) {
        // ----------resize for set in imageView------------
        int width = yourSelectedImageBitmap.getWidth();
        int height = yourSelectedImageBitmap.getHeight();
        int newWidth = 140;
        int newHeight = 140;

        // calculate the scale - in this case = 0.4f
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;

        Matrix matrix = new Matrix();
        // resize the bit map
        matrix.postScale(scaleWidth, scaleHeight);
        if (exifOrientation.equals("6")) {
            matrix.postRotate(90);
        }

        Bitmap resizedBitmap = Bitmap.createBitmap(yourSelectedImageBitmap,
                0, 0, width, height, matrix, true);
        image.setImageBitmap(resizedBitmap);

        // Toast.makeText(getApplicationContext(),
        // "in the select image loop", 2000).show();

        // ----------resize for upload------------
        int width1 = yourSelectedImageBitmap.getWidth();
        int height1 = yourSelectedImageBitmap.getHeight();

この方法で試してみることができます。ファイルソースまたはカメラから画像を取得した後。

そしてこれを行うことによって。

Matrix matrix1 = new Matrix();
        // resize the bit map
        matrix.postScale(width1, height1);
        if (exifOrientation.equals("6")) {
            matrix1.postRotate(90);
        }
        Bitmap resizedBitmap1 = Bitmap.createBitmap(
                yourSelectedImageBitmap, 0, 0, width1, height1, matrix1,
                true);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        resizedBitmap1.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] image_bytes = baos.toByteArray();

        try {
            baos.flush();
            baos.close();

        } catch (IOException e) {
            e.printStackTrace();
            Log.e("~~~~~~~~IOException~~~~~~~~~eeeeee~~~~",
                    "~~~~~~IOException~~~~~~~~~eeeee~~~~" + e.getMessage());
        }
        image_string = Base64.encodeToString(image_bytes, 0);

これがお役に立てば幸いです

于 2013-01-21T10:57:53.117 に答える
1

あなたはこのようにすることができます:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.icon);
Bitmap bmpCompressed = Bitmap.createScaledBitmap(bitmap, 600, 400, true);

ByteArrayOutputStream bos = new ByteArrayOutputStream();

// CompressFormat set up to JPG, you can change to PNG
bmpCompressed.compress(CompressFormat.JPEG, 90, bos);
imageByteArray = bos.toByteArray();
于 2013-01-21T11:45:02.973 に答える
0

これでうまくいくと思います

 BitmapFactory.Options opt = new BitmapFactory.Options();
 opt.inMutable = true;  //you have to set bitmap to mutable
 bmp1 = BitmapFactory.decodeResource(getResources(), R.drawable.map_distance_tag,opt);
 Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), Bitmap.Config.ARGB_8888);

 //if you want to copy the bmp1 to bmOverlay
 bmOverlay=Bitmap.createScaledBitmap(bmp1, bmp1.getWidth, bmp1.getHeight, false);

         OR

//if did not work replace bmOverlay to this:
 bmOverlay = Bitmap.createBitmap(bmp1);
于 2013-01-25T02:40:37.903 に答える
0

私は同じ問題を抱えていました、そしてそれは私を夢中にさせていました。変更して問題を解決することになりました

Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());

Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), Bitmap.Config.ARGB_8888);
于 2014-02-12T15:56:54.327 に答える