OI FileManager verwenden

  • Antworten:7
Tobias Heine
  • Forum-Beiträge: 9

24.05.2010, 10:44:47 via Website

Hallo,
ich versuche mich in der Android Entwicklung und habe ein Problem.
Ich habe ein kleines App geschrieben, welches ein bestehendes Bild bearbeitet (Schwarz/Weiß, negativ usw.)
Soweit so gut...

Nun möchte ich einen Schritt weiter gehen und dem User eine Dateiauswahl bieten.
Bisher geben ich eine feste Datei über "res" an.

Bei meiner Suche nach einer geeigneten Lösung bin ich auf den o.g. FileManager gestoßen (http://www.openintents.org/en/node/159), der sich wohl leicht aus anderen apps einbinden lässt.
Leider bin ich wohl unfähig diesen FileManager zu benutzen :)

Ich habe mir nun den TestFileManager herunter geladen und bekomme ihn auch zum Laufen. Allerdings erhalte ich, sobald ich einen Button drücke immer die Meldung, dass "no compatible file manager" gefunden wurde.
(http://code.google.com/p/openintents/downloads/list?q=testfilemanager)

Das liegt, soweit ich den Code verstehe, daran, dass die Intents ins "Nichts" verweisen.
Das Package "org.openintents.action" ist nicht vorhanden.

Ich habe dann versucht, den kompletten FileManager als Projekt zu importieren, den ich allerdings gar nicht zum Laufen bekomme.
Der Ordner gen ist leer und Eclipse mault auch bei einigen XML-Dateien herum...

Kann mir jemand weiterhelfen ?
Gibt es eventl. noch eine Alternative ?

Noch einen kleiner Hinweis:
Ich studiere Medieninformatik im 2. Semester. Bitte entschuldigt also, wenn ich noch den einen oder anderen "dummen" Java-Fehler mache :)

Tobi

Antworten
Tobias E.
  • Forum-Beiträge: 180

25.05.2010, 10:25:23 via Website

Hallo Tobi,

Wie Du den OI FileManager zum laufen bringst kann ich Dir leider nicht sagen. Die Lösung an sich sieht ganz elegant aus. Weiss allerdings nicht wieviel Overhead Du Dir einkaufst wenn Du so ein komplettes Paket mit in Deine Anwendung einbindest.

Du kannst Dir prinzipiell auch selbst eine Übersicht bauen in der Art wie sie z.B. die Gallery App liefert. Android stellt Dir eine Datenbank zur Verfügung, über die Du Thumbnails der auf dem Telefon abgelegten Bilder abfragen kannst. Das ganze geht in etwa wie folgt:

Wähle aus auf welche Bilder Du zugreifen möchtest:

1Uri images = Images.Thumbnails.EXTERNAL_CONTENT_URI;
oder
1Uri images = Images.Thumbnails.INTERNAL_CONTENT_URI;

Bau ein String Array um die Ergebnisse der Datenbankabfrage zu speichern, sowie ein Array für die Thumbnail Bitmaps und die Image IDs

1Bitmap BITMAP[];
2 String ID[];
3 int NUMBER_OF_IMAGES;
4
5 String[] projection = new String[] {
6 Images.Thumbnails.IMAGE_ID,
7 Images.Thumbnails.HEIGHT,
8 Images.Thumbnails.WIDTH,
9 Images.Thumbnails.DATA,
10 Images.Thumbnails.KIND
11 };

Mit der folgenden Abfrage erhältst Du Thumbnails für alle Bilder auf dem Telefon, sortiert nach der IMAGE_ID in aufsteigender Reihenfolge:

1Cursor cur = managedQuery(images, projection, Images.Thumbnails.KIND + " = " + String.valueOf(Images.Thumbnails.MINI_KIND), null, Images.Thumbnails.IMAGE_ID + " ASC");

Lass die Abfrage laufen und hole Dir alle Thumbnails:

[code]
Cursor cur = managedQuery(images, projection, Images.Thumbnails.KIND + " = " + String.valueOf(Images.Thumbnails.MINI_KIND), null, Images.Thumbnails.IMAGE_ID + " ASC");

cur.moveToFirst();

NUMBER_OF_IMAGES = cur.getCount();

if (NUMBER_OF_IMAGES == 0) {
BITMAP = null;
ID = null;
}
else {
BITMAP = new Bitmap[NUMBER_OF_IMAGES];
ID = new String[NUMBER_OF_IMAGES];
for (int i=0; i<NUMBER_OF_IMAGES; i++) {
height = cur.getInt(cur.getColumnIndex(Images.Thumbnails.HEIGHT));
width = cur.getInt(cur.getColumnIndex(Images.Thumbnails.WIDTH));
kind = cur.getInt(cur.getColumnIndex(Images.Thumbnails.KIND));

try {
path = cur.getString(cur.getColumnIndex(Images.Thumbnails.DATA));
BITMAP[i] = Bitmap.createScaledBitmap(BitmapFactory.decodeFile(path), 100, 100, false);
}
catch (Exception e) {
BITMAP[i]=null;
}

ID[i]=cur.getString(cur.getColumnIndex(Images.Thumbnails.IMAGE_ID));
cur.moveToNext();
[/code]

Als Ergebnis hast Du ein Bitmap Array mit Thumbnails aller auf dem Telefon gespeicherten Bilder (im Beispiel hab ich die Größe auf 100x100 Pixel gesetzt, das kannst Du ändern wie Du magst), sowie ein array ID[] mit den Bitmap IDs. Damit kannst Du dann einen Auswahl-Bildschirm aufbauen indem Du mit den Thumbnails einen entsprechenden Screen füllst (als Liste, Tabelle, oder wie Du magst).

Mit der Bitmap ID kannst Du dann ein Image vollständig laden:

1public static Bitmap getImage(String id) {
2 Uri images = Images.Media.EXTERNAL_CONTENT_URI;
3 String path;
4
5 String[] projection = new String[] {
6 MediaColumns.DATA
7 };
8
9 Cursor cur = managedQuery(images, projection, BaseColumns._ID+" = "+id, null, null);
10
11 cur.moveToFirst();
12 if (cur.getCount()==0) return(null);
13 else {
14 try {
15 path = cur.getString(cur.getColumnIndex(MediaColumns.DATA));
16 return(BitmapFactory.decodeFile(path));
17 }
18 catch (Exception e) {
19 return(null);
20 }
21 }
22 }

Wenn Du das ganze ausprobierst, wirst Du früher oder später darauf stossen dass Android erst ab ich glaube Version 2.0 die Thumbnails konsequent selbst erzeugt. Unter älteren Versionen kann es passieren daß Du ein Image im Telefon ablegst (z.B. durch Download auf dem Web), Android aber kein Thumbnail erzeugt und in der Thumbnail Datenbank ablegt. Mit der Abfrage oben erhälst Du dann kein Thumbnail für das entsprechende Image.

Die neueren Android Versionen bieten hier eine Routine an um die Thumbnails automatisch zu erzeugen. Mit älteren Versionen musst Du so etwas selbst bauen.

Viele Grüße,

Tobias

Antworten
Tobias Heine
  • Forum-Beiträge: 9

25.05.2010, 20:30:59 via Website

wow, danke für deine Hilfe.

Ich habe mittlerweile mit der freundlichen Hilfe von Open Intents den FileManager doch noch einbinden können.
Den Dateipfad der ausgewählten Datei gebe ich auch erfolgreich via putExtra() an die nächste Activity weiter.
Dort gibt es nun eine lokale Variable path, die den Dateipfad zur SD-Karte beinhaltet.

ABER:
Das eigentliche Zeichnen erfolgt in einer eigenen View, die per setContentView() zugewiesen wird.
Dort erstelle ich auch mithilfe der BitmapFactory die Bitmap-Datei. Aber ich komme von der View nicht auf meine Activity-Variablen :(.
Ich bin nur noch einen kleinen Schritt davon entfernt mithilfe von BitmapFactory.decodeFile() und dem Pfad die Datei zu benutzen.

Wie greife ich von einer View auf Variablen der Activity zu, oder wie gebe ich Daten an eine View weiter ?

Antworten
Tobias E.
  • Forum-Beiträge: 180

25.05.2010, 20:42:49 via Website

Die Quick and Dirty Variante für so etwas ist es eine statische Klasse zu erzeugen. In dieser deklarierst Du dann eine statische String Variable. Auf diese kannst Du dann aus allen Klassen Deiner App aus zugreifen.

Für einfache Elemente wie Strings oder einfache int-Variablen ist sowas durchaus machbar. Nur größere Objekte wie z.B. einen Link zu Deiner App solltest Du nicht in der statischen Klasse ablegen da das schnell zu größeren Memory Leaks führt. Die in der statischen Klasse vorhandenen Werte werden auch nicht unbedingt gelöscht wenn Deine App endet, d.h. Du musst sie explizit in Deiner onCreate() Methode initialisieren um sicher zu stellen dass Du nicht Werte von Deinem vorherigen App-Lauf verwendest.

Die elegantere Methode ist es den Wert an Deine View zu übergeben. Du kannst doch von der Activity aus eine Methode Deiner View aufrufen und den Wert übergeben?

Als letztes kannst Du Deiner View beim erzeugen aus der Activity heraus einen link auf die Activity mitgeben. Das tust Du eigentlich eh schon dadurch das Du beim erzeugen den Context (=Deine Activity) übergibst. Speichere die Activity in einer lokalen Variablen in Deiner View, und schon hast Du Zugriff auf alle Activity Variablen.

Wie hast Du letztlich den FileManager zum laufen gebracht?

Antworten
Tobias Heine
  • Forum-Beiträge: 9

25.05.2010, 22:05:27 via Website

Hy Tobi :),

der IO FileManager muss auf dem Device installiert sein, dann kann man ihn folgendermaßen nutzen:

Intent fileIntent = new Intent("org.openintents.action.PICK_FILE");

protected void onActivityResult(int requestCode, int resultCode, Intent fileIntent) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, fileIntent);
path = fileIntent.getData().toString();
}


Ich verzweifele mittlerweile aber an meinem Code...
Deinen Tipp mit der Methode habe ich umgesetzt (vor lauter Bäumen den Wald nicht mehr gesehen).
Allerdings bekomme ich nun an dieser Stelle eine Nullpointerexception:

image = BitmapFactory.decodeFile(this.path);
pixel = new int[image.getWidth()*image.getHeight()];

wenn ich das Bild so lade, funktioniert es image = BitmapFactory.decodeResource(getResources(),R.drawable.image);.


Anbei mein Code, vllt. hast du ja noch eine Idee:

Die Hauptactivity:

1public class StartView extends Activity implements OnClickListener{
2 /**Die Buttons*/
3 private Button file, start;
4 /**Ein Intent zum Starten einer zweiten Activity*/
5 private Intent mainIntent;
6 private Intent fileIntent;
7
8 private String path;
9
10 public static String DATEI_PFAD="pfad";
11
12 @Override
13 protected void onCreate(Bundle savedInstanceState) {
14 // TODO Auto-generated method stub
15 super.onCreate(savedInstanceState);
16 setContentView(R.layout.main);
17
18 file = (Button)findViewById(R.id.choose);
19 file.setOnClickListener(this);
20
21 start = (Button)findViewById(R.id.start);
22 start.setOnClickListener(this);
23
24 mainIntent = new Intent(this, MainView.class);
25 fileIntent = new Intent("org.openintents.action.PICK_FILE");
26 }
27
28 /**
29 * Listener Methode für die beiden Buttons
30 */
31 public void onClick(View v) {
32 // TODO Auto-generated method stub
33 if(v == file || v== start){
34 if(v == file){
35 startActivityForResult(fileIntent, 1);
36 return;
37 }
38 else{
39 //Gib der Activity den Pfad zur gewählten Datei mit
40 mainIntent.putExtra(DATEI_PFAD, this.path);
41 this.startActivity(mainIntent);
42
43 }
44 }
45 }
46
47 @Override
48 protected void onActivityResult(int requestCode, int resultCode, Intent fileIntent) {
49 // TODO Auto-generated method stub
50 super.onActivityResult(requestCode, resultCode, fileIntent);
51 path = fileIntent.getData().toString();
52 }
53
54}

Die Activity mit dem eigentlichen App

1package de.view;
2
3
4import android.app.Activity;
5import android.content.Intent;
6import android.os.Bundle;
7import android.view.Menu;
8import android.view.MenuInflater;
9import android.view.MenuItem;
10
11/**
12 * Die Hauptklasse des Projektes ImageDisplay
13 * @author Tobias Heine
14 *
15 */
16public class MainView extends Activity {
17 /** Called when the activity is first created. */
18
19 /**Eine Referenz auf die Klasse DrawView wird erstellt*/
20 private DrawView view;
21
22 /**Ein Intent zum Starten einer Activity*/
23 private Intent startIntent;
24 /**Pfad zu der Datei, welche in der Activity StartView ausgewählt wurde*/
25 private String path;
26 /**
27 *Die Activity wird gestartet und dem Inhalt wird eine DrawView zugewiesen
28 */
29 public void onCreate(Bundle savedInstanceState) {
30 super.onCreate(savedInstanceState);
31 view = new DrawView(this);
32 setContentView(view);
33 //Ein Intent, der auf die Menü-Activity zeigt
34 startIntent = new Intent(this, StartView.class);
35 //Der Pfad zur ausgewählten Datei
36 Bundle meinBundle = getIntent().getExtras();
37 path = (String)meinBundle.getString(StartView.DATEI_PFAD);
38 //Der View den Pfad mitteilen
39 view.setPath(path);
40 }
41
42 /**
43 * Das Options Menü wird erstellt und die einzelnen Menüpunkte hinzugefügt
44 */
45 public boolean onCreateOptionsMenu(Menu menu) {
46 //MenuInflater, der anhand von menu.xml das Menü baut
47 MenuInflater inflater = getMenuInflater();
48 inflater.inflate(R.menu.menu, menu);
49 return true;
50 }
51
52 /**
53 * Listener Methode für die einzelnen Menüpunkte
54 */
55 public boolean onOptionsItemSelected(MenuItem item) {
56
57 switch (item.getItemId()) {
58 case R.id.ORIGINAL:
59 view.drawOriginal();
60 return true;
61
62 case R.id.GREY_ID:
63 view.drawGrey();
64 return true;
65
66 case R.id.NEGATIVE_ID:
67 view.drawNegative();
68 return true;
69
70 case R.id.SEPIA:
71 view.drawSepia();
72 return true;
73
74 case R.id.BEST_COLORS:
75 view.drawBestColors();
76 return true;
77
78 case R.id.ERROR_DIFF:
79 view.drawErrorDiff();
80 return true;
81
82 case R.id.BLACK_WHITE:
83 view.drawBlackWhite();
84 return true;
85
86 case R.id.MENU:
87 this.startActivity(startIntent);
88 return true;
89
90 default:
91 return false;
92 }
93 }
94
95 public String getPath(){
96 return path;
97 }
98}

Und noch die View:

[code]package de.view;


import de.view.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class DrawView extends View
{
MainView main = new MainView();

/**Pfad zu der Bitmap-Datei*/
String path;
/**Das Canvas auf dem die Bilder gezeichnet werden*/
Canvas bitmapCanvas;
/**Die Bilddatei, welche auf das Canvas gezeichnet wird*/
Bitmap image;
/**Variable zum Zwischenspeichern der Farbe der Pixel*/
int aktcolor;
/**Die sechs bestmöglichen Farben*/
int farben [][] = {
{46,100,138},
{104,134,162},
{102,90,81},
{34,37,36},
{209,207,208},
{158,144,134}
};
/**Die einzelnen Distanzen*/
int [] distanz = new int [farben.length];
/**Boolean-Wert, damit init() nur einmalig ausgeführt wird*/
boolean isInitialized;
/**Notwendiges Paint Objekt*/
Paint paint = new Paint();
/**Array zum Speichern der Pixel*/
int[] pixel;
/**Wert zum Ermitteln der Fehlerdifussion*/
int diff_error;

/**
* Konstruktor
* @param context
*/
public DrawView(Context context)
{
super(context);

isInitialized = false;
}

/**
* Canvas wird initialisiert es wird ein Bitmap zugewiesen
*/
private void init()
{

// image = BitmapFactory.decodeResource(getResources(),R.drawable.image);
// Das Image wird anhand dem übergebenen Pfad erstellt

image = BitmapFactory.decodeFile(this.path);
pixel = new int[image.getWidth()*image.getHeight()];

//Alle Pixel werden in dem Array pixel gespeichert
image.getPixels(pixel, 0, image.getWidth(), 0, 0, image.getWidth(), image.getHeight());

bitmapCanvas = new Canvas();
bitmapCanvas.setBitmap(image);

isInitialized = true;
}

/**
* Methode zum Zeichnen des Bildes
* @param canvas Das Canvas, auf dem gezeichnet wird
*/
public void onDraw(Canvas canvas)
{
if (!isInitialized){
init();
}
canvas.drawBitmap(image, 0, 0, paint);
}

/**
* Negativbild
*/
public void drawNegative(){
for(int y=0;y<image.getHeight();y++){
for(int x=0;x<image.getWidth();x++){

aktcolor = image.getPixel(x, y);

int r = (aktcolor >> 16) & 0xff;
int g = (aktcolor >> 8) & 0xff;
int b = aktcolor & 0xff;

//Negativ-Wert berechnen
int rn = 255-r;
int gn = 255-g;
int bn = 255-b;

// Hier muessen die neuen RGB-Werte wieder auf den Bereich von 0 bis 255 begrenzt werden
if(rn>255){
rn = 255;
}

if(gn>255){
gn = 255;
}

if(bn>255){
bn = 255;
}

if(rn<0){
rn = 0;
}

if(gn<0){
gn = 0;
}

if(bn<0){
bn = 0;
}

image.setPixel(x, y, Color.rgb(rn, gn, bn));
}
}
invalidate();
}

/**
* Sepia-Färbung
*/
public void drawSepia(){
for(int y=0;y<image.getHeight();y++){
for(int x=0;x<image.getWidth();x++){

aktcolor = image.getPixel(x, y);

int r = (aktcolor >> 16) & 0xff;
int g = (aktcolor >> 8) & 0xff;
int b = aktcolor & 0xff;

//Grauwert berechnen
int grau = (int) (r * 0.3 + g * 0.59 + b * 0.11);

int rn = grau+95;
int gn = grau+65;
int bn = grau;

// Hier muessen die neuen RGB-Werte wieder auf den Bereich von 0 bis 255 begrenzt werden
if(rn>255){
rn = 255;
}

if(gn>255){
gn = 255;
}

if(bn>255){
bn = 255;
}

if(rn<0){
rn = 0;
}

if(gn<0){
gn = 0;
}

if(bn<0){
bn = 0;
}

image.setPixel(x, y, Color.rgb(rn, gn, bn));
}
}
invalidate();
}

/**
* Graustufenbild
*/
public void drawGrey(){
for(int y=0;y<image.getHeight();y++){
for(int x=0;x<image.getWidth();x++){

aktcolor = image.getPixel(x, y);

int r = (aktcolor >> 16) & 0xff;
int g = (aktcolor >> 8) & 0xff;
int b = aktcolor & 0xff;

int grau = (int) (r * 0.3 + g * 0.59 + b * 0.11);

int rn = grau;
int gn = grau;
int bn = grau;

// Hier muessen die neuen RGB-Werte wieder auf den Bereich von 0 bis 255 begrenzt werden
if(rn>255){
rn = 255;
}

if(gn>255){
gn = 255;
}

if(bn>255){
bn = 255;
}

if(rn<0){
rn = 0;
}

if(gn<0){
gn = 0;
}

if(bn<0){
bn = 0;
}

image.setPixel(x, y, Color.rgb(rn, gn, bn));
}
}

invalidate();
}

/**
* Originalbild
*/
public void drawOriginal(){
//Die Originalpixel aus dem Array pixel werden wieder in das Bild geschrieben
image.setPixels(pixel, 0, image.getWidth(), 0, 0, image.getWidth(), image.getHeight());
invalidate();
}

/**
* Auswahl aus den vorgegebenen besten Farben
*/
public void drawBestColors() {
for(int y=0;y<image.getHeight();y++){
for(int x=0;x<image.getWidth();x++){

aktcolor = image.getPixel(x, y);

int r = (aktcolor >> 16) & 0xff;
int g = (aktcolor >> 8) & 0xff;
int b = aktcolor & 0xff;

//Die aktuellen Farben werden in einem Array gespeichert
int [] aktfarben = {r,g,b};
//Eine minimale Distanz mit einem großen Wert wird erstellt
int minDistanz=255;
//Die Variable für die jeweilige Sollfarbe des einzelnen Pixels
int sollfarbe=-1;

//Distanzen zwischen dem aktuellen Farbvektor und den 6 möglichen Farben berechnen
for(int i=0;i<farben.length;i++){
distanz[i]=(int) Math.sqrt( (aktfarben[0]-farben[i][0])*(aktfarben[0]-farben[i][0]) + (aktfarben[1]-farben[i][1])*(aktfarben[1]-farben[i][1]) + (aktfarben[2]-farben[i][2])*(aktfarben[2]-farben[i][2]));
}

//
int rn=aktfarben[0];
int gn=aktfarben[1];
int bn=aktfarben[2];

//die kleinste Distanz bestimmen und anhand dieser die Sollfarbe für den aktuellen Pixel bestimmen
for(int i=0;i<distanz.length;i++){

if( minDistanz>distanz[i]){
minDistanz=distanz[i];
sollfarbe=i;
}

}

rn=farben[sollfarbe][0];
gn=farben[sollfarbe][1];
bn=farben[sollfarbe][2];

image.setPixel(x, y, Color.rgb(rn, gn, bn));
}
}
invalidate();
}

/**
* Fehlerdifussion
*/
public void drawErrorDiff(){
for(int y=0;y<image.getHeight();y++){
for(int x=0;x<image.getWidth();x++){

aktcolor = image.getPixel(x, y);

int r = (aktcolor >> 16) & 0xff;
int g = (aktcolor >> 8) & 0xff;
int b = aktcolor & 0xff;

//Grauwert berechnen und Fehler abziehen
int grau = (int) (r * 0.3 + g * 0.59 + b * 0.11)-diff_error;

//Schwarz-Weiss Werte berechnen
int sw= (grau>=128) ? 255 : 0;

//Fehlerdifferenz für den nächsten Pixel berechnen
diff_error = sw-grau;

int rn = sw;
int gn = sw;
int bn = sw;

// Hier muessen die neuen RGB-Werte wieder auf den Bereich von 0 bis 255 begrenzt werden
if(rn>255){
rn = 255;
}

if(gn>255){
gn = 255;
}

if(bn>255){
bn = 255;
}

if(rn<0){
rn = 0;
}

if(gn<0){
gn = 0;
}

if(bn<0){
bn = 0;
}

image.setPixel(x, y, Color.rgb(rn, gn, bn));
}
}

invalidate();
}

/**
* Schwarz/Weiß
*/
public void drawBlackWhite(){
for(int y=0;y<image.getHeight();y++){
for(int x=0;x<image.getWidth();x++){

aktcolor = image.getPixel(x, y);

int r = (aktcolor >> 16) & 0xff;
int g = (aktcolor >> 8) & 0xff;
int b = aktcolor & 0xff;

//Grauwert berechnen
int grau = (int) (r * 0.3 + g * 0.59 + b * 0.11);

int rn = grau;
int gn = grau;
int bn = grau;

//Schwarz-Weiss Werte berechnen
rn= (rn>=128) ? 255 : 0;
gn= (gn>=128) ? 255 : 0;
bn= (bn>=128) ? 255 : 0;


image.setPixel(x, y, Color.rgb(rn, gn, bn));
}
}

invalidate();
}

/**
*
*/
public void setPath(String path){
this.path=path;
}
}[/code]

— geändert am 26.05.2010, 07:45:03

Antworten
Tobias Heine
  • Forum-Beiträge: 9

26.05.2010, 08:37:06 via Website

Ich habe noch ein bisschen probiert und mich durch einige Foren gelesen, bin aber noch nicht weitergekommen.

BitmapFactory.decodeFile() gibt einfach immer null zurück, egal welchen Pfad ich angebe.

image = BitmapFactory.decodeFile("/sdcard/bear.jpg");
image = BitmapFactory.decodeFile("file:///sdcard/bear.jpg");

Sogar wenn ich den Namen meiner festhinterlegten Ressource angebe:
image = BitmapFactory.decodeFile("de.view:drawable/image");

da BitmapFactory.decodeResource() funktioniert habe ich mir überlegt, man könnte ja auch zur Laufzeit mit dem Dateipfad eine Ressource anlegen und diese dann verwenden. Aber ob das geht, konnte ich leider auch nicht in Erfahrung bringen... :(

Antworten
Tobias E.
  • Forum-Beiträge: 180

26.05.2010, 23:32:41 via Website

Hab jetzt Deinen Code nicht getestet. Auf den ersten Blick würde ich sagen da gibt's wahrscheinlich ein security Problem beim Dateizugriff. Probier mal ein Bild aus dem Web runter zu laden und auf SD zu speichern (Web-Seite im Browser aufrufen, langer Click auf ein Bild und dann speichern auf SD Karte).

Das solltest Du dann auf jeden Fall laden können. Der Pfad ist: /sdcard/download/image.jpg

Antworten
Tobias Heine
  • Forum-Beiträge: 9

27.05.2010, 09:06:06 via Website

Leider nein :(

Ich habe wieder alle Möglichkeiten durchprobiert:

- Ich habe das Bild manuell auf meinem ISO Image der SD Karte unter "download" abgelegt
- Ich habe über den Emulator ein Bild aus dem Web gespeichert und verwendet

Fester Pfad
1image = BitmapFactory.decodeFile("/sdcard/download/srgb917g.jpg");

Über Variable
1image = BitmapFactory.decodeFile(this.path);

Aber immer noch eine NullpointerException:

Antworten