Bild von SD-Karte als Hintergrundbild setzen

  • Antworten:7
teha
  • Forum-Beiträge: 6

21.04.2012, 19:36:09 via Website

Hi,

ich habe gerade eine App geschrieben, die ein Bild von der SD-Karte auswählen und dieses als Hintergrundbild des Home-Bildschirms setzen soll.
Das ist mein Code (teilweise):

1public void setWallpaper(Uri filepath) {
2 WallpaperManager m = WallpaperManager.getInstance(this);
3
4 try {
5 Bitmap bitmap = BitmapFactory.decodeFile(filepath);
6 m.setBitmap(bitmap);
7 } catch (IOException e) {
8 Log.e("App", "Fehler bei setBitmap()", e);
9 }
10 }

Leider stürzt die App bei dem m.setBitmap(bitmap); mit der Meldung "...closed unexpectedly" ab. Der Fehler scheint eine NullPointerException zu sein. Ich kenne mich leider nicht mit der BitmapFactory aus, daher hoffe ich, dass mir jemand weiterhelfen kann.

Achja, "filepath" ist (wie man sehen kann) von Typ Uri und "filepath.toString()" ergibt z.B. "content://media/external/images/media/2" und wurde durch eine Auswahl vorher erzeugt.

Ich hoffe, dass mir jemand weiterhelfen kann, denn irgendwie komme ich nicht drauf :/

Danke und viele Grüße,
teha

Antworten
Markus B.
  • Forum-Beiträge: 636

22.04.2012, 00:33:28 via Website

Hallo, dann hau doch mal den ganzen StackTrace raus.
Wenn ich raten müssen würde ich sagen "filepath" gibt es nicht oder du hast die Rechte vergessen.

Gruß,
Markus

Antworten
teha
  • Forum-Beiträge: 6

22.04.2012, 02:37:19 via Website

Erstmal danke für deine Antwort!

Hier ist mal der Stacktrace:
104-22 00:33:22.728: D/AndroidRuntime(330): Shutting down VM
204-22 00:33:22.728: W/dalvikvm(330): threadid=1: thread exiting with uncaught exception (group=0x40015560)
304-22 00:33:22.738: E/AndroidRuntime(330): FATAL EXCEPTION: main
404-22 00:33:22.738: E/AndroidRuntime(330): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { dat=content://media/external/images/media/3 }} to activity {com.tehagames.mydesktop/com.tehagames.mydesktop.MyDesktopActivity}: java.lang.NullPointerException
504-22 00:33:22.738: E/AndroidRuntime(330): at android.app.ActivityThread.deliverResults(ActivityThread.java:2532)
604-22 00:33:22.738: E/AndroidRuntime(330): at android.app.ActivityThread.handleSendResult(ActivityThread.java:2574)
704-22 00:33:22.738: E/AndroidRuntime(330): at android.app.ActivityThread.access$2000(ActivityThread.java:117)
804-22 00:33:22.738: E/AndroidRuntime(330): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:961)
904-22 00:33:22.738: E/AndroidRuntime(330): at android.os.Handler.dispatchMessage(Handler.java:99)
1004-22 00:33:22.738: E/AndroidRuntime(330): at android.os.Looper.loop(Looper.java:123)
1104-22 00:33:22.738: E/AndroidRuntime(330): at android.app.ActivityThread.main(ActivityThread.java:3683)
1204-22 00:33:22.738: E/AndroidRuntime(330): at java.lang.reflect.Method.invokeNative(Native Method)
1304-22 00:33:22.738: E/AndroidRuntime(330): at java.lang.reflect.Method.invoke(Method.java:507)
1404-22 00:33:22.738: E/AndroidRuntime(330): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
1504-22 00:33:22.738: E/AndroidRuntime(330): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
1604-22 00:33:22.738: E/AndroidRuntime(330): at dalvik.system.NativeStart.main(Native Method)
1704-22 00:33:22.738: E/AndroidRuntime(330): Caused by: java.lang.NullPointerException
1804-22 00:33:22.738: E/AndroidRuntime(330): at android.app.WallpaperManager.setBitmap(WallpaperManager.java:484)
1904-22 00:33:22.738: E/AndroidRuntime(330): at com.tehagames.mydesktop.MyDesktopActivity.setWallpaper(MyDesktopActivity.java:58)
2004-22 00:33:22.738: E/AndroidRuntime(330): at com.tehagames.mydesktop.MyDesktopActivity.onActivityResult(MyDesktopActivity.java:44)
2104-22 00:33:22.738: E/AndroidRuntime(330): at android.app.Activity.dispatchActivityResult(Activity.java:3908)
2204-22 00:33:22.738: E/AndroidRuntime(330): at android.app.ActivityThread.deliverResults(ActivityThread.java:2528)
2304-22 00:33:22.738: E/AndroidRuntime(330): ... 11 more

Welche Rechte meinst du? Ich habe bisher nur android.permission.SET_WALLPAPER eingebaut."filepath" hat den Wert "content://media/external/images/media/3" vor der Ausführung.

Danke schon mal und viele Grüße,
teha

Antworten
Markus B.
  • Forum-Beiträge: 636

22.04.2012, 11:01:19 via Website

Hallo, okay es ist nun auffallend ein NullPointer in MyDesktopActivity.java Zeile 58.
Dann schau doch ein genau in diese Zeile und gib dort alle Variablen aus und schau welche Null ist. Dann überlegst du dir warum das so ist.
Wenn du nicht weiter kommst sag mir mal was in der Zeile 58 steht.

Wegen dem Recht:
Okay da hast du das passende gesetzt :)

Pfad:
content://media/external/images/media/2
Hast du schon nach geschaut, ob dieser auf deinem Device vorhanden ist ?

Gruß,
Markus

Antworten
teha
  • Forum-Beiträge: 6

22.04.2012, 13:43:02 via Website

Hi,

danke für deine Antwort! Zeile 58 ist "m.setBitmap(bmp);".

Also wenn ich (testhalber) mal bitmap.toString() mit Log.e(...) ausgegebe, kommt derselbe Fehler, daher liegt es wohl an der Variablen "bitmap". Wenn ich nämlich "m.setResource(R.drawable.testbg);" geht das problemlos, d.h. der WallpaperManager funktioniert.

Der Pfad "content://media/external/images/media/2" kommt von der vorherigen Auswahl eines Bildes per:
1Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
2 startActivityForResult(intent, 0);

Ich denke daher schon, dass die Datei unter dem Pfad verfügbar ist.

Danke nochmal und viele Grüße,
teha

Antworten
Markus B.
  • Forum-Beiträge: 636

22.04.2012, 15:27:59 via Website

Hi,
folgendes sagt das Java Doc zu BitmapFactory.decodeFile(String pathName)

Decode a file path into a bitmap. If the specified file name is null, or cannot be decoded into a bitmap, the function returns null.

Somit stimmt etwas mit dem Pfad nicht. Dein Pfad content://media/external/images/media/2 gibt ja auch kein Bild an, sondern verweist auf ein Verzeichnis. Somit kann auch keine Bitmap erzeugt werden.

Gruß,
Markus

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

22.04.2012, 17:54:40 via App

Hey,

wahrscheinlich musst diese Adresse vom Media Provider in den Pfad zur Datei auflösen lassen.

Lg Ansgar

Antworten
teha
  • Forum-Beiträge: 6

22.04.2012, 19:28:49 via Website

Ich habe es jetzt rausbekommen! Habe diesen Codeausschnitt im Internet gefunden:
1public String getPath(Uri uri) {
2 String[] projection = { MediaStore.Images.Media.DATA };
3 Cursor cursor = managedQuery(uri, projection, null, null, null);
4 startManagingCursor(cursor);
5 int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
6 cursor.moveToFirst();
7 return cursor.getString(column_index);
8 }

Und ich kann auch nachvollziehen, was das macht, denke ich.

Vielen Dank an euch beide!

Viele Grüße,
teha

Antworten