524 Stimmen

Bitmap an einem Ort speichern

Ich arbeite an einer Funktion, die ein Bild von einem Webserver herunterlädt, es auf dem Bildschirm anzeigt und, wenn der Benutzer das Bild behalten möchte, es auf der SD-Karte in einem bestimmten Ordner speichert. Gibt es eine einfache Möglichkeit, ein Bitmap zu nehmen und es einfach auf der SD-Karte in einem Ordner meiner Wahl zu speichern?

Mein Problem ist, dass ich das Bild herunterladen kann, zeigen Sie es auf dem Bildschirm als Bitmap. Die einzige Möglichkeit, die ich gefunden habe, um ein Bild in einem bestimmten Ordner zu speichern, ist die Verwendung von FileOutputStream, aber das erfordert ein Byte-Array. Ich bin nicht sicher, wie zu konvertieren (wenn dies sogar der richtige Weg ist) von Bitmap zu Byte-Array, so dass ich eine FileOutputStream verwenden können, um die Daten zu schreiben.

Die andere Möglichkeit, die ich habe, ist die Verwendung von MediaStore :

MediaStore.Images.Media.insertImage(getContentResolver(), bm,
    barcodeNumber + ".jpg Card Image", barcodeNumber + ".jpg Card Image");

Das Speichern auf der SD-Karte funktioniert gut, aber Sie können den Ordner nicht anpassen.

2voto

Zar E Ahmer Punkte 32557

Einige neue Geräte speichern keine Bitmaps, also habe ich ein wenig mehr erklärt.

Vergewissern Sie sich, dass Sie Folgendes hinzugefügt haben unter Erlaubnis

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

und erstellen Sie eine xml-Datei unter xml Ordnername provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external_files"
        path="." />
</paths>

und in AndroidManifest unter

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>

dann einfach saveBitmapFile(passYourBitmapHere) aufrufen

public static void saveBitmapFile(Bitmap bitmap) throws IOException {
        File mediaFile = getOutputMediaFile();
        FileOutputStream fileOutputStream = new FileOutputStream(mediaFile);
        bitmap.compress(Bitmap.CompressFormat.JPEG, getQualityNumber(bitmap), fileOutputStream);
        fileOutputStream.flush();
        fileOutputStream.close();
    }

wobei

File getOutputMediaFile() {
        File mediaStorageDir = new File(
                Environment.getExternalStorageDirectory(),
                "easyTouchPro");
        if (mediaStorageDir.isDirectory()) {

            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
                    .format(Calendar.getInstance().getTime());
            String mCurrentPath = mediaStorageDir.getPath() + File.separator
                            + "IMG_" + timeStamp + ".jpg";
            File mediaFile = new File(mCurrentPath);
            return mediaFile;
        } else { /// error handling for PIE devices..
            mediaStorageDir.delete();
            mediaStorageDir.mkdirs();
            galleryAddPic(mediaStorageDir);

            return (getOutputMediaFile());
        }
    }

und andere Methoden

public static int getQualityNumber(Bitmap bitmap) {
        int size = bitmap.getByteCount();
        int percentage = 0;

        if (size > 500000 && size <= 800000) {
            percentage = 15;
        } else if (size > 800000 && size <= 1000000) {
            percentage = 20;
        } else if (size > 1000000 && size <= 1500000) {
            percentage = 25;
        } else if (size > 1500000 && size <= 2500000) {
            percentage = 27;
        } else if (size > 2500000 && size <= 3500000) {
            percentage = 30;
        } else if (size > 3500000 && size <= 4000000) {
            percentage = 40;
        } else if (size > 4000000 && size <= 5000000) {
            percentage = 50;
        } else if (size > 5000000) {
            percentage = 75;
        }

        return percentage;
    }

et

void galleryAddPic(File f) {
        Intent mediaScanIntent = new Intent(
                "android.intent.action.MEDIA_SCANNER_SCAN_FILE");
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);

        this.sendBroadcast(mediaScanIntent);
    }

1voto

Mayank Saini Punkte 2987

Hey, gib einfach den Namen an .bmp

Tun Sie dies:

ByteArrayOutputStream bytes = new ByteArrayOutputStream();
_bitmapScaled.compress(Bitmap.CompressFormat.PNG, 40, bytes);

//you can create a new file name "test.BMP" in sdcard folder.
File f = new File(Environment.getExternalStorageDirectory()
                        + File.separator + "**test.bmp**")

es wird sich so anhören, als ob ich nur herumalbere, aber wenn du es einmal versuchst, wird es im bmp-Format gespeichert Prost

1voto

Thracian Punkte 13019

Nach Android 4.4 Kitkat, und 2017 liegt der Anteil von Android 4.4 und weniger bei etwa 20 % und nimmt weiter ab, ist es nicht mehr möglich, auf der SD-Karte zu speichern. File Klasse und getExternalStorageDirectory() Methode. Diese Methode gibt den internen Speicher Ihres Geräts zurück und speichert Bilder, die für jede App sichtbar sind. Sie können auch Bilder speichern, die nur für Ihre App bestimmt sind und gelöscht werden, wenn der Benutzer Ihre App mit openFileOutput() Methode.

Ab Android 6.0 können Sie Ihre SD-Karte als internen Speicher formatieren, aber nur für Ihr Gerät. (Wenn Sie die SD-Karte als internen Speicher formatieren, kann nur Ihr Gerät auf den Inhalt zugreifen oder ihn sehen). Sie können auf dieser SD-Karte mit anderen Antworten speichern, aber wenn Sie eine austauschbare SD-Karte verwenden möchten, sollten Sie meine Antwort unten lesen.

Sie sollten Folgendes verwenden Rahmen für den Speicherzugang um uri zum Ordner zu erhalten onActivityResult Methode der Aktivität, um den vom Benutzer ausgewählten Ordner zu erhalten, und fügen Sie eine dauerhafte Berechtigung hinzu, damit der Benutzer nach einem Neustart des Geräts auf den Ordner zugreifen kann.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK) {

        // selectDirectory() invoked
        if (requestCode == REQUEST_FOLDER_ACCESS) {

            if (data.getData() != null) {
                Uri treeUri = data.getData();
                tvSAF.setText("Dir: " + data.getData().toString());
                currentFolder = treeUri.toString();
                saveCurrentFolderToPrefs();

                // grantUriPermission(getPackageName(), treeUri,
                // Intent.FLAG_GRANT_READ_URI_PERMISSION |
                // Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

                final int takeFlags = data.getFlags()
                        & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                // Check for the freshest data.
                getContentResolver().takePersistableUriPermission(treeUri, takeFlags);

            }
        }
    }
}

Speichern Sie jetzt den Ordner in den gemeinsamen Einstellungen, damit der Benutzer nicht jedes Mal einen Ordner auswählen muss, wenn Sie ein Bild speichern wollen.

Sie sollten Folgendes verwenden DocumentFile Klasse, um Ihr Bild zu speichern, nicht File o ParcelFileDescriptor Für weitere Informationen können Sie unter dieses Thema zum Speichern von Bildern auf SD-Karte mit compress(CompressFormat.JPEG, 100, out); Methode und DocumentFile classes.

-1voto

Sujay U N Punkte 4456

|==| PNG-Datei aus Bitmap erstellen :

void devImjFylFnc(String pthAndFylTtlVar, Bitmap iptBmjVar)
{
    try
    {
        FileOutputStream fylBytWrtrVar = new FileOutputStream(pthAndFylTtlVar);
        iptBmjVar.compress(Bitmap.CompressFormat.PNG, 100, fylBytWrtrVar);
        fylBytWrtrVar.close();
    }
    catch (Exception errVar) { errVar.printStackTrace(); }
}

// |==| Bimap aus Datei holen :

Bitmap getBmjFrmFylFnc(String pthAndFylTtlVar)
{
    return BitmapFactory.decodeFile(pthAndFylTtlVar);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X