Speichern und Anzeigen von Images / Bitmaps - Internal Storage

  • Antworten:5
  • Bentwortet
L. Rittershofer
  • Forum-Beiträge: 7

08.06.2017, 21:00:12 via Website

Mein Layout sieht folgendermaßen aus:

<Button
    android:id="@+id/button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="80dp"
    android:layout_marginRight="80dp"
    android:text="Upload Image"
    android:onClick="**onClickUpload**"
    android:layout_marginBottom="30dp" />

<ImageView
    android:id="@+id/imgPicker"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_marginTop="15dp"
    android:layout_marginLeft="30dp"
    android:layout_marginRight="30dp"
    android:onClick="**onClickShow**"
    app:srcCompat="@android:color/holo_orange_dark" />

Mein Ziel: über den Button kommt der User zu seiner Image Gallery und kann ein Foto auswählen. Das wird dann im internen Speicher unter einem bestimmten Dateinamen abgelegt.

Wenn der Nutzer dann auf den ImageView drückt, soll das zuvor abgespeicherte Image die Bitmap Resource des ImageViews ersetzen und dem User angezeigt werden.

Upload:

public void onClickUpload(View view) {
    startActivityForResult(new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), GET_FROM_GALLERY);
}

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

    //Detects request codes
    if(requestCode==GET_FROM_GALLERY && resultCode == Activity.RESULT_OK) {
        Uri selectedImage = data.getData();
        Bitmap bitmap = null;
        try {
            bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage);

            ContextWrapper cw = new ContextWrapper(getApplicationContext());
            // path to /data/data/yourapp/app_data/imageDir
            File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
            // Create imageDir
            File mypath=new File(directory,"profile.jpg");

            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(mypath);
                // Use the compress method on the BitMap object to write image to the OutputStream
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            directory.getAbsolutePath();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

Bitmap ersetzen:

public void onClickImage (View view)
{
    String p = getFilesDir().toString();
    String path = p+"/imageDir/";

    try {
        File f=new File(path, "profile.jpg");
        Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f));
        ImageView img=(ImageView)findViewById(R.id.imgPicker);
        img.setImageBitmap(b);
    }
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }
}

Kann mir vielleicht wer sagen was ich falsch mache? Ich weiß leider auch absolut nicht wie ich auf meinem Emulator Bilder zur Gallerie hinzufügen kann und wenn ich die App über das Android Phone laufen lass, kann ich mir (meine ich zumindest) keine Fehlermeldungen anzeigen lassen. Das macht das ganze noch etwas schwieriger.

Freu mich auf euren Rat :)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

08.06.2017, 21:08:51 via Website

Hallo und herzlich wilkommen hier im Forum :)

zuerst mal ist es wichtig, dass du genau beschreibst, was nicht tut.

Zudem kannst du die App per ADB auf deinem Phone debuggen und unter LogCat auch die passenden Fehlermeldungen einsehen.
Je nachdem welche AndroidVersion zu als Target hast, musst du berücksichtigen, dass man ab Android 6 die Rechte explizit abfragen und vom User genemigen lassen muss, bevor man zugriff auf den "externen" Speicher bekommt (USB-Speicher ist aus App Sicher extern!)
Zudem müssen die passenden manifest permissions gesetzt werden.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
L. Rittershofer
  • Forum-Beiträge: 7

08.06.2017, 21:30:40 via Website

Meinst du mit den manifest permissions:

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

ab Android 6 die Rechte explizit abfragen und vom User genemigen lassen muss

Wie funktioniert diese Abfrage dann? Auf die Bilder kann ich zugreifen und wenn ich ein Bild anklicke dauert es kurz (scheint zumindest etwas zu laden). Wenn ich dann aber auf den ImageView klicke dauert es 2-3 Sekunden bis die App crasht. Kann es morgen dann leider erst wieder testen, wenn mein Freund mit seinem Android kommt (ich selbst bin iPhone Nutzer (devil)(laughing)(laughing))

Antworten
L. Rittershofer
  • Forum-Beiträge: 7

08.06.2017, 21:52:24 via Website

Oh ja beim Upload bekomm ich folgendes:

java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/file from pid=20240, uid=10046 *requires android.permission.READ_EXTERNAL_STORAGE*, or grantUriPermission()

Habe jetzt folgendes ausprobiert:

public void onClickUpload(View view) {

    // Here, thisActivity is the current activity
    if (ContextCompat.checkSelfPermission(DetailActivity.this,
            Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(DetailActivity.this,
                Manifest.permission.READ_EXTERNAL_STORAGE)) {

            // Show an explanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.

        } else {

            // No explanation needed, we can request the permission.

            ActivityCompat.requestPermissions(DetailActivity.this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);

            // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            // app-defined int constant. The callback method gets the
            // result of the request.
        }
    }

    startActivityForResult(new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), GET_FROM_GALLERY);
}

...und außerdem noch onRequestPermissionsResult überschrieben. Bei mir öffnet sich aber nicht mal das Dialogfenster in dem nach der Permission gefragt wird :?

Manifest:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".activities.LoginActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".activities.RegisterActivity"
        android:screenOrientation="portrait" />
    <activity
        android:name=".activities.CategoryActivity"
        android:screenOrientation="portrait" />
    <activity android:name=".activities.SuggestionActivity" />
    <activity
        android:name=".activities.DetailActivity"
        android:theme="@style/AppTheme" />

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

— geändert am 08.06.2017, 23:15:00

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.958

09.06.2017, 05:04:39 via App

Hallo und herzlich willkommen hier im Forum (*)

sorry wenn ich hier rein springe, die Permission muss oberhalb - vor Application - angelegt werden und für die Permission Anfrage würde ich Dexter nutzen, es ist sehr einfach gehalten und nimmt dir einiges ab.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Pascal P.

Antworten