Salve. Sto cercando di disegnare un'immagine Bitmap su un canvas più alto di un tot. Questo perché devo poter condividere l'immagine su facebook dove sotto mostra delle informazioni aggiuntive (che vado a scrivere io sul canvas). Diciamo un po come quelle immagini di quelle applicazioni che mostrano il percorso svolto e sotto ci sono dati come km, calorie ecc.

1) Ottengo la mia Bitmap (catturo l'immagine dello schermo Android) e la salvo nel telefono.

2) Passo la bitmap al metodo che dovrebbe le opportune modifiche

3) Salvo il risultato nel telefono (sovrascrivo la bitmap originale in sostanza)

4) Avvio l'Intent per la condivisione

Codice:

codice:
public void shareTrack(View v) {


        if(NOTHING) {
            return;
        }


        // sposta la visuale sul tracciato e visualizza lo start
        // nascondo i markers centrali
        if(PATH_MARKERS) {
            for (int i = 1; i < mMarkersList.size() - 1; i++) {
                mMarkersList.get(i).setVisible(false);
            }
        }


        // cattura e salva l'immagine della mappa
        CaptureMapScreen();


        // crea e salva nel telefono l'immagine catturata della mappa
        File file = new File("/mnt/sdcard/" + "MyMapScreen" + ".png");


        // crea il bitmap a partire dall'immagine della mappa aggiungendo
        // informazioni varie
        Bitmap bitmap = drawTextToBitmap(file);


        // salva il risultato nel telefono
        try {
            FileOutputStream out = new FileOutputStream("/mnt/sdcard/"
                    + "MyMapScreen" + ".png"); // era MyNewMapScreen
            bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.flush();
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


        //I create the new file for the share
        File shareFile = new File("/mnt/sdcard/"
                + "MyMapScreen" + ".png"); // era MyNewMapScreen


        Intent shareIntent = new Intent(Intent.ACTION_SEND);
        shareIntent.setType("image/png");
        shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(shareFile));
        startActivity(Intent.createChooser(shareIntent, "Share"));


        //Ripristino la visibilità dei Markers
        if(PATH_MARKERS) {
            for (int i = 1; i < mMarkersList.size() - 1; i++) {
                mMarkersList.get(i).setVisible(true);
            }
        }
    }
codice:
private Bitmap drawTextToBitmap(File file) {
        try {
            // ottengo la densità dello schermo
            Resources resources = getResources();
            float scale = resources.getDisplayMetrics().density;
            Bitmap bitmap = BitmapFactory.decodeFile(file.getPath());
            android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig();
            // default bitmap
            if(bitmapConfig == null) {
                bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888;
            }
            // le bitmaps sono immutabili
            // allora è necessario convertirle in mutabili
            // bitmap mappa
            bitmap = bitmap.copy(bitmapConfig, true);


            // colore sfondo
            Paint backgroundPaint = new Paint();
            backgroundPaint.setColor(Color.parseColor("#DDDDDD"));
            // creo la bitmap per lo sfondo, più alto di 200 pixel rispetto all'immagine della mappa catturata
            Bitmap bg = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight() + 200, Bitmap.Config.ARGB_8888);
            // rendo mutabile la bitmap
            bg = bg.copy(bitmapConfig, true);
            // creo il canvas su cui disegnare
            Canvas canvas = new Canvas(bg);
            // disegno un rettangolo sul canvas alla quale applico un colore grigio molto chiaro
            canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), backgroundPaint);
            // disegno l'immagine della mappa sul canvas
            canvas.drawBitmap(bitmap, 0, 0, null);


            // oggetto paint con antialiasing per il testo
            Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);


            // text color (in base al tipo di mappa impostata)
            if(mapType == GoogleMap.MAP_TYPE_NORMAL || mapType == GoogleMap.MAP_TYPE_NONE
                    || mapType == GoogleMap.MAP_TYPE_TERRAIN) {
                paint.setColor(Color.BLACK);
            }
            if(mapType == GoogleMap.MAP_TYPE_HYBRID || mapType == GoogleMap.MAP_TYPE_SATELLITE) {
                paint.setColor(Color.WHITE);
            }


            // dimensioni del testo in pixel
            paint.setTextSize((int) (20 * scale));
            // text shadow (raggio, inclinazione sinistra, inclinazione destra, colore)
            paint.setShadowLayer(20, 0, 0, Color.RED);


            // font
            Typeface tf = Typeface.createFromAsset(getAssets(),"my_font.ttf");
            paint.setTypeface(tf);


            // draw text to the Canvas center
            Rect bounds = new Rect();


            // ROBA DOVE SCRIVO COSE


            return bitmap;


        } catch (Exception e) {
            return null;
        }
    }
La bitmap risultate sembra essere null, poiché ottengo NullPointerException a questa riga:
codice:
bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
O comunque ottengo la stessa eccezione se metto una stampa di Log della Bitmap prima di
salvarla nel telefono.