Bild für externen Speicher

  • Antworten:17
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 13

02.05.2019, 12:48:15 via Website

Moin moin,

ja, ich schon wieder ^^ Erneut habe ich eine kleine aber feine Frage.
Und zwar schreibe ich eine App, bei der ich auf den speicher zugreifen muss, um ein Profilbild zu setzen.
Leider konnte ich bisher nicht herausfinden, wo ich die Testbilder in AS ablegen muss, damit ich sie mit dem Emulator auch finde.
Kann mir jemand sagen wo der richtige Speicherort ist? =)

mfg Firlefanz

Diskutiere mit!
Gelöschter Account
  • Forum-Beiträge: 79

02.05.2019, 12:53:50 via Website

Moin

du möchtest also auf deiner emulierten Device die Datei im Speicher haben? Oder möchtest du es als Resource in deinem Projekt zur Verfügung haben?

Ersteres ist ganz einfach realiserbar, indem du deine Beispieldatei per Drag&Drop in dein emuliertes Telefon schiebst, die Datei wird dann in das Handy kopiert und steht dort zur Verfügung.

Letzteres wird realisiert, in dem du das Bild in den drawable-Ordner schiebst, dan ist es beim Entwickeln als Resource verfügbar.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 13

02.05.2019, 13:16:16 via Website

mhh ja ich denke es ist die erste Variante, leider funktioniert das mit dem Drag and Drop nicht.

Nur zur Sicherheit: ich habe eine Funktion, die in den externen Speicher des simulierten Handys schaut und dort sollten Bilder liegen damit man sich eines aussuchen kann.

Das Programm greift auch brav zu, leider ist der Ordner leer. weder die Bilder aus dem drawable Ordner sind angezeigt, noch die, die ich manuell rein gezogen habe

Ich denke das ist der interessante Befehl:
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)

— geändert am 02.05.2019, 13:18:07

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 3.240

02.05.2019, 13:18:16 via Website

Die erstere von Roberts Idee ist die beste ,weil du ja den physischen Dateizugriff testen möchtest.

Bei der Zweiteren nimmst du dir das Bild lediglich aus der Resource.
(Und dabei muss das Bild sehr klein sein , oder du erstellst dir den drawable-nodpi Ordner.
Sonst kommt es ggf. zum Absturz wegen fehlendem Rendering-Speichers (Out of Memory))

mhh ja ich denke es ist die erste Variante, leider funktioniert das mit dem Drag and Drop nicht.

Wie wäre es mit rechter Maustaste "upload" ?? :-)

— geändert am 02.05.2019, 13:22:24

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 13

02.05.2019, 13:26:07 via Website

Ich habe das blöde Gefühl wir reden aneinander vorbei^^

Ich meine mit Emulator das simulierte Handy richtig? :D

Ich kann da nichts reinziehen und auch keinen Rechtsklick drauf machen...

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 3.240

02.05.2019, 13:31:39 via Website

Nein , wir reden nicht aneinander vorbei :-)(music)

Emulator oder ADB/USB starten , GAAAAAAAANZ unten rechts in AS "Device File Explorer" und dann
im Ziel rechte Maustaste.

— geändert am 02.05.2019, 13:33:02

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 3.240

02.05.2019, 13:43:47 via Website

Ja da , wo du sie nach der Aufnahme hinlegst ???

An dem Punkt ist unsere Kristallkugel leider nicht mehr leistungsfähig -
Das weist nur du als Entwickler

— geändert am 02.05.2019, 14:01:28

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 13

02.05.2019, 14:13:28 via Website

Wenn man sein virtuelles Handy startet, steht da ja was von ssd, muss ich es auf die ssd legen oder is der externe speicher wo anders?

weil auf der ssd abgelegte Bilder sehe ich leider in meiner App immer noch nicht

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 3.240

02.05.2019, 14:23:05 via Website

Wenn man sein virtuelles Handy startet, steht da ja was von ssd, muss ich es auf die ssd legen oder is der externe speicher wo anders?

Ich weis zwar nicht , wo du jetzt herumklickst, aber bei mir ist nichts von SSD im Emulator zu sehen.
(Obwohl ich einige davon im PC verbaut habe)

Zu deiner Frage : Du solltest dich erst mal mit dem FileSystem von Android / resp Linux auseinander setzen und für Dich bestimmen , wohin du dein DatenContent stellen willst.
https://developer.android.com/training/data-storage/files

Danach musst du Deine App mit User-Permissions ausstatten - sonst kannst du weder Schreiben noch Lesen.
https://developer.android.com/training/permissions/requesting

Erst dann bist du überhaupt erst in der Lage auf Dateien zuzugreifen

— geändert am 02.05.2019, 14:38:09

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 3.240

02.05.2019, 14:28:58 via Website

oben links in der Ecke. steht SD mit ner kleinen angezeigten Chipkarte.

Alles klar , denn du hast ja oben SSD geschrieben :-)

Und nochmal : Das was dir der Emulator anzeigt ist unrelevant , wichtig ist der Device Explorer

— geändert am 02.05.2019, 14:31:07

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 13

02.05.2019, 18:04:08 via Website

Naja das Problem ist weiterhin das der Device Explorer ja nicht gerade klein ist bzw wenige Ordner enthält.

Ich werf hier jez einfach mal die Klasse rein und hoffe das ihr dann den AHA! Moment habt der mir seit Stunden fehlt <.<

Sorry für den riesen Codehaufen aber ich weiß wirklich keinen Ausweg mehr :/

public class ProfileActivity extends AppCompatActivity {

int userId;
String username;
String userImage;

ImageView imageView;
TextView usernameTV;
// EditText passwordET;

Bitmap currentBitmap;

RequestQueue queue;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile);

    userId = PreferenceManager.getDefaultSharedPreferences(this).getInt("id", -1);
    username = PreferenceManager.getDefaultSharedPreferences(this).getString("username", "-1");
    userImage = PreferenceManager.getDefaultSharedPreferences(this).getString("image", "-1");

    imageView = findViewById(R.id.profile_imageView);
    usernameTV = findViewById(R.id.profile_username);
    // passwordET = findViewById(R.id.profile_password);

    queue = Volley.newRequestQueue(this);

    if(userImage != null && userImage.length() > 0) {

        imageView.setImageBitmap(Util.getBitmapFromBase64String(userImage));
        currentBitmap = Util.getBitmapFromBase64String(userImage);

    } else {

        imageView.setImageResource(R.drawable.standard_user_image);
        currentBitmap = Util.getBitmapFromDrawable(this, R.drawable.standard_user_image);

    }

    usernameTV.setText(username);

    setTitle(username);
}

public void chooseImage(View view) {

    if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

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

    }

    Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(i, 1);

}

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

    if(requestCode == 1 && resultCode == RESULT_OK && data != null) {

        Uri selectedImage = data.getData();

        if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){

//------------------------------------ HIER irgendwo vermute ich den Fehler------------------------------------

            try {
                Bitmap bitmapImage = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage);

                imageView.setImageBitmap(bitmapImage);
                currentBitmap = bitmapImage;

            } catch (IOException e) {
                e.printStackTrace();
            }

        } else {

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

        }

    }
}

public void saveUserImage(View view) {

    final Bitmap smallerBitmap = currentBitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);

    final String bitmapString = Util.getBase64StringFromBitmap(smallerBitmap);

    String create_user_url = getString(R.string.cliq) + "/insertBitmapIntoDB_cliq.php";

    StringRequest postRequest = new StringRequest(Request.Method.POST, create_user_url,

            response -> {

                Log.i("response", response);

// try {
//
// JSONObject jsonResponse = new JSONObject(response);
// String message = jsonResponse.getString("message");
//
//
// int success = Integer.parseInt(jsonResponse.get("success").toString());
//
// if(success == 1){
//
// Toast.makeText(ProfileActivity.this, message, Toast.LENGTH_SHORT).show();
// PreferenceManager.getDefaultSharedPreferences(ProfileActivity.this).edit().putString("image", Util.getBase64StringFromBitmap(smallerBitmap)).apply();
//
// }
//
// } catch (JSONException e) {
// e.printStackTrace();
// }

            }, error -> {


    }) {
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<>();
            params.put("user_id", String.valueOf(userId));
            params.put("bitmapString", bitmapString);

            return params;
        }
    };


    queue.add(postRequest);
}

}

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 3.240

02.05.2019, 18:19:22 via Website

HIER irgendwo vermute ich den Fehler

Ja wo denn ? - Ich sehe so Einges , was nicht klappen dürfte

a) Ein ErrorLog wäre super hilfreich , was sagen deine Exceptions ??
b) Was sagt dein Step-Debugging ?
c) Warum denn in den Mediastore ? - Den Request haste gar nicht permittet - gehört auch nicht hierher.
d) Wo ist denn dein PHP - Request-Thread ? Ein php request gehört immer in einen Thread - oder nimm eine Callback Library (ION, OKHttp etc)

Nachtrag zu d) sehe eben , dass du schon Volley einsetzt .... Bei dem Wirrwar von Programstruktur kann man das leicht übersehen :-)

Also Errorlogs und expeptions nachliefern bitte und schreibe das Image auch in ein FILE.
Du hast schliesslich die Permissions dazu angefordert.

— geändert am 02.05.2019, 18:27:50

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 13

02.05.2019, 18:38:07 via Website

Wären da exceptions, hätte ich was zu suchen gehabt. Das Programm an sich läuft einwandfrei, ich bekomme nur in diesen Ordner keine Bilder gespeichert, da ich den ordner nicht finde, da du aber die Mediathek erwähnst, weist du bestimmt wie ich da was rein bekomm oder? ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 3.240

02.05.2019, 18:42:32 via Website

siehe meinen Link von Oben

https://developer.android.com/training/data-storage/files

Normalerweise ist das dann data/Android/[DeinPackagename]/files - NICHT im Media Contentresolver.
Der wird erst ein wenig später geupdated, wenn du das Bild in ein File geschrieben hast ...

— geändert am 02.05.2019, 18:45:02

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 777

02.05.2019, 19:43:49 via Website

Hallo ich mische mich mal etwas dazu.

Zu dem Thema Permission ist meiner Meinung nach so auch nicht ganz ok und zwar reagierst du gar nicht auf irgend einer Antwort vom User. Wenn du denn User nach der permissoin fragst mit
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 9);
Macht du einfach wieder ob der User ja oder nein klickt bekommst du gar nicht mit.
Du startest einfach deinen intent ob du nun die permission hast oder nicht checkst du gar nicht.

Ob der User nun zugestimmt hat oder nicht ob du die permissoin auch schon hast . Ist dir scheinbar egal du startest einfach deinen intent.

Denn intent startest du immer ganz gleich, ob du die permissen hast oder nicht. Macht nicht viel Sinn.

Die Antwort vom User kommt in der onRequestPermissionsResult
Methoden an. Die es bei dir nicht gibt.

Wird den der intent überhaupt korrekt ausgeführt?

Kommst du überhaupt in die onActivityResult?

Und wird da auch ein resultCode und auch das RESULT_OK übergeben? Damit es überhaupt weider gehen kann.

Übrigens bist du uns auch noch dein log File schuldig.

— geändert am 02.05.2019, 20:39:38

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 777

03.05.2019, 07:24:03 via Website

Mal noch ein Nachtrag.

Habe mir deinen Code noch mal angesehen. Ok auf das „data“ Objekt greifst du zu.
Wenn das mit deinen Perrmissions richtig wäre würde es auch gehen das du das Bild was der User in der Gallery auswählt. In dem Imageview angezeigt wird.
Da du die Permissen nicht richtig abfragst wird das erst beim zweiten Start deiner App gehen. Das heißt wen der User beim ersten App Start auch die Abfrage bestätigt hat. Und du somit beim zweiten App Start auch die Permission hast.
Dann kommt auch etwas in dem „data“ Objekt an. Ohne Permission wird es wohl lehr sein. Das würdest du ach im Log File sehen wenn wir es den hätten.

Denn auf die User Bestätigung wartest und reagierst du nicht.
Das macht man in der onRequestPermissionsResult Methode.

Und zu der frage wo du die Bilder auf dem Emulator ablegen sollst.
Genau dort wo die emulierte Kamera ein Bild speichert.
Das ist beim Emulator meistens die internen SD Karte.

/storage/emulated/0/DCIM/Camera

das ist eigentlich das Verzeichnis in den die Gallery auch Standard mäßig nach schaut. Oder du gibst beim Intent ein Verzeichnis an.

so und nun noch etwas Code von mir.

public void chooseImage(View view) {

    if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

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

    }
    else {

        Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(i, 1);

    }

}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case 9:
            {
               if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                  Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                  startActivityForResult(i, 1);

               } else {
                  Toast.makeText(getApplicationContext(),"Permissoin wurde abgelehnt",Toast.LENGTH_LONG).show();

               }
               return;
            }
    }
}



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

    if(requestCode == 1 && resultCode == RESULT_OK && data != null) {

        Uri selectedImage = data.getData();

        if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){

//------------------------------------ HIER irgendwo vermute ich den Fehler------------------------------------
// nein der Fehler ist nicht hier
// du hast in diesem moment nicht die Permission deshalb ist "data" lehr.

            try {
                Bitmap bitmapImage = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage);

                imageView.setImageBitmap(bitmapImage);
                currentBitmap = bitmapImage;

            } catch (IOException e) {
                e.printStackTrace();
            }

        } else {

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

        }

    }
}

— geändert am 03.05.2019, 18:01:27

Hilfreich?
Diskutiere mit!