Profilbild umsetzen?

  • 10 Antworten
  • Neuester Beitrag
Diskutiere Profilbild umsetzen? im Android App Entwicklung im Bereich Betriebssysteme & Apps.
B

Binbose

Ambitioniertes Mitglied
Hallo Leute,

ich versuche mich momentan daran, ein Profilbild in meine App zu implementieren. Man soll das Bild aus der Gallerie des Smartphones auswählen können. Dazu haben ich im Internet diesen Code-Snippet gefunden:

Code:
public class BrowsePictureActivity extends Activity {

    // this is the action code we use in our intent, 
    // this way we know we're looking at the response from our own action
    private static final int SELECT_PICTURE = 1;

    private String selectedImagePath;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ((Button) findViewById(R.id.Button01))
                .setOnClickListener(new OnClickListener() {

                    public void onClick(View arg0) {

                       // in onCreate or any event where your want the user to
                       // select a file
                       Intent intent = new Intent();
                       intent.setType("image/*");
                       intent.setAction(Intent.ACTION_GET_CONTENT);
                       startActivityForResult(Intent.createChooser(intent,
                                "Select Picture"), SELECT_PICTURE);
                    }
                });
    }

   public void onActivityResult(int requestCode, int resultCode, Intent data){
        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_PICTURE) {
                Uri selectedImageUri = data.getData();
                selectedImagePath = getPath(selectedImageUri);
            }
        }
    }

    /**
     * helper to retrieve the path of an image URI
     */
    public String getPath(Uri uri) {
            // just some safety built in 
            if( uri == null ) {
                // TODO perform some logging or show user feedback
                return null;
            }
            // try to retrieve the image from the media store first
            // this will only work for images selected from gallery
            String[] projection = { MediaStore.Images.Media.DATA };
            Cursor cursor = managedQuery(uri, projection, null, null, null);
            if( cursor != null ){
                int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                return cursor.getString(column_index);
            }
            // this is our fallback here
            return uri.getPath();
    }

}
Der Dialog zum Auswählen eines Bildes öffnet sich auch Prima, aber
jetzt habe ich 3 Probleme.

1. Wenn ich ein Bild auswähle (aus der emulierten Gallerie) und selectedImagePath zur Probe mit System.out.println oder Log ausgeben lasse,
dann sürzt die App jedesmal ab. Dabei ist es selcetedImagePath ja eigentlich ein String und müsste damit gehen, oder verpasse ich da was?

2.Wie kann ich das Bild auf das der Path zeigt dann in einem eigenen Dateisystem abspeichern und in einer ImageView
anzeigen lassen? Ich bin in dem Thema leider überhaupt nicht drin, vlt. habt ihr für sowas ja einen schönen Beispielcode oder ein gutes Tutorial
(habe leider nichts passendes bei Google gefunden)

3. Würdet ihr das überhaupt so machen für ein Profilbild oder wähle ich da schon den falschen Ansatz?^^ :confused2:

danke schonmal im Vorraus für eure Hilfe,


mfg Binbose
 
DagobertDokate

DagobertDokate

Experte
1. Wenn ich ein Bild auswähle (aus der emulierten Gallerie) und selectedImagePath zur Probe mit System.out.println oder Log ausgeben lasse,
dann sürzt die App jedesmal ab. Dabei ist es selcetedImagePath ja eigentlich ein String und müsste damit gehen, oder verpasse ich da was?
Was sagt denn die Logcat?

lg. Dagobert
 
B

Binbose

Ambitioniertes Mitglied
Soweit ich das erkennen kann steht da nicht sehr viel, es funktioniert auch alles, solange ich selectedImagePath nicht ausgeben lasse


07-15 13:21:29.857: E/AndroidRuntime(1126): FATAL EXCEPTION: main
07-15 13:21:29.857: E/AndroidRuntime(1126): Process: com.example.stoos, PID: 1126
07-15 13:21:29.857: E/AndroidRuntime(1126): java.lang.IllegalStateException: Could not execute method of the activity
07-15 13:21:29.857: E/AndroidRuntime(1126): at android.view.View$1.onClick(View.java:3823)
07-15 13:21:29.857: E/AndroidRuntime(1126): at android.view.View.performClick(View.java:4438)
07-15 13:21:29.857: E/AndroidRuntime(1126): at android.view.View$PerformClick.run(View.java:18422)
07-15 13:21:29.857: E/AndroidRuntime(1126): at android.os.Handler.handleCallback(Handler.java:733)
07-15 13:21:29.857: E/AndroidRuntime(1126): at android.os.Handler.dispatchMessage(Handler.java:95)
07-15 13:21:29.857: E/AndroidRuntime(1126): at android.os.Looper.loop(Looper.java:136)
07-15 13:21:29.857: E/AndroidRuntime(1126): at android.app.ActivityThread.main(ActivityThread.java:5017)
07-15 13:21:29.857: E/AndroidRuntime(1126): at java.lang.reflect.Method.invokeNative(Native Method)
07-15 13:21:29.857: E/AndroidRuntime(1126): at java.lang.reflect.Method.invoke(Method.java:515)
07-15 13:21:29.857: E/AndroidRuntime(1126): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
07-15 13:21:29.857: E/AndroidRuntime(1126): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
07-15 13:21:29.857: E/AndroidRuntime(1126): at dalvik.system.NativeStart.main(Native Method)
07-15 13:21:29.857: E/AndroidRuntime(1126): Caused by: java.lang.reflect.InvocationTargetException
07-15 13:21:29.857: E/AndroidRuntime(1126): at java.lang.reflect.Method.invokeNative(Native Method)
07-15 13:21:29.857: E/AndroidRuntime(1126): at java.lang.reflect.Method.invoke(Method.java:515)
07-15 13:21:29.857: E/AndroidRuntime(1126): at android.view.View$1.onClick(View.java:3818)
07-15 13:21:29.857: E/AndroidRuntime(1126): ... 11 more
07-15 13:21:29.857: E/AndroidRuntime(1126): Caused by: java.lang.NullPointerException
07-15 13:21:29.857: E/AndroidRuntime(1126): at com.android.internal.os.LoggingPrintStream.println(LoggingPrintStream.java:298)
07-15 13:21:29.857: E/AndroidRuntime(1126): at com.example.stoos.ProfileinstellungenAendern.onClickSpeichern(ProfileinstellungenAendern.java:75)
07-15 13:21:29.857: E/AndroidRuntime(1126): ... 14 more

07-15 13:21:32.967: D/dalvikvm(1178): GC_FOR_ALLOC freed 86K, 6% free 2965K/3136K, paused 136ms, total 138ms
07-15 13:21:32.987: I/dalvikvm-heap(1178): Grow heap (frag case) to 3.583MB for 635812-byte allocation
07-15 13:21:33.047: D/dalvikvm(1178): GC_FOR_ALLOC freed 2K, 5% free 3583K/3760K, paused 66ms, total 66ms
07-15 13:21:33.487: D/(1178): HostConnection::get() New Host Connection established 0xb8278c80, tid 1178
07-15 13:21:33.527: W/EGL_emulation(1178): eglSurfaceAttrib not implemented
07-15 13:21:33.537: D/OpenGLRenderer(1178): Enabling debug mode 0
 
DagobertDokate

DagobertDokate

Experte
07-15 13:21:29.857: E/AndroidRuntime(1126): Caused by: java.lang.NullPointerException
07-15 13:21:29.857: E/AndroidRuntime(1126): at com.android.internal.os.LoggingPrintStream.println (LoggingPrintStream.java:298)
Was du da loggen willst ist auf jeden fall null...

lg.
 
B

Binbose

Ambitioniertes Mitglied
Ja, ich weiß bloß leider nicht warum, wie gesagt, dass ist ein fertiger Code aus dem Internet, der sollte eigentlich funktionieren
 
T

tuppy

Neues Mitglied
Erstmal rate ich dir dringend auf das Datum zu schauen von dem Zeuchs, was du abschreiben willst.

Das ist uralter Code. Und falls du Eclipse nutzt, sollte der dir auch anzeigen, dass da was ned mehr stimmt.

Beim Intent nimmste
Code:
new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
dann holste dir den cursor über den contentresolver

Code:
getContentResolver(data.getData(), 
new String[] {MediaStore.Images.Media.DAta}, 
null, null, null}
dann haste den path und kannst die bitmap laden

(optional halt die checks wegen null)
 
S

Saenchai

Erfahrenes Mitglied
Binbose schrieb:
Ja, ich weiß bloß leider nicht warum, wie gesagt, dass ist ein fertiger Code aus dem Internet, der sollte eigentlich funktionieren
Davon kannst Du Dich sofort verabschieden :)

Sowas gibts sogut wie gar nicht, man muss beinahe immer irgendwelche Class-Namen oder sonstwas anpassen. Es werden immer Probleme auftauchen wie diese, denn der eine hat im Code ganz andere Imports als der andere. Während einer auf Support Framework arbeitet tuts der andere nicht, der eine hat Code für Fragments angepasst und der andere für Activities. Und das sind nur wenige Beispiele von Problemem die auftreten (werden).

Du musst leider durch und Dich mit dem Them intensiver beschäftigen, sorry :)
 
B

Binbose

Ambitioniertes Mitglied
Naja, auf die Class Namen und Imports habe ich schon geachtet, da meckert ja sonst Eclipse auch rum

Kann mir einer von euch denn sagen was ich mir das am besten so alles angucken muss um beschriebene Funktionen umzusetzen? Und vlt. noch gut verständliche Tutorials für die Asprekte die man da braucht empfehlen? :)
 
S

Saenchai

Erfahrenes Mitglied
Sofern du des englischen mächtig bist hab ich ein wirklich gutes Tutorial zum anfangen, ja. Der erklärt es von Anfang an, auf verständliche weise. Meistens zumindest. Das ist zwar ein wenig älter auch, aber hat den Vorteil das du hier durch alle Stufen innerhalb der selben app geführt wirst und somit den Überblick besser hast als wenn du ein tutorial hier und das andere dort machst.

https://buckysroom.org/videos.php?cat=6

Wenn du das durch hast, was innerhalb 2 Wochen passiert sein sollte, kannst du apps bauen. Oder zumindest dich zurechtfinden und selber code implementieren.
 
B

Binbose

Ambitioniertes Mitglied
Naja, ich bin ja nicht völlig neu bei der Android Entwicklung, habe schon ein paar kleinere Apps auch mit Datenbanken, Listen etc. geschrieben, nur diese Multimedia Schiene ist halt neu für mich, aber weil ich das nicht so oft brauche wollte ich mal fauel sein und mich da jetzt nicht so reinhängen und fertige Code Snippets benutzen bzw. spezifische Tutorials um eben nicht das ganze drumerhum nochmal zu haben, dass ich schon mehr oder weniger kann^^

Aber trotzdem danke, dann werde ich eben die Tutorials von Buckysroom gucken.