Android Dateien senden von assets Ordner?

bruce85

Bekanntes Mitglied
Hallo,
ich versuche schon seit gestern Dateien per Email zu senden, leider ohne erfolg.

Alles was Google mir geliefert hat, funktionierte auch nicht:
Code:
Datei kann nicht angehängt werden.
Dateigröße beträgt 0 Byte.

Java:
ArrayList<Uri> audioUri = new ArrayList<Uri>();
	                	for (int i = checkedItems.size() - 1; i >= 0; i--) {
	                        if (checkedItems.valueAt(i)) {
	                        	pos = checkedItems.keyAt(i);
	                        	Uri uri=Uri.parse(getAssets()+"sound/"+sound.get(pos).fileName);
	                        	audioUri.add(uri);
	                        }
	                    }
	                	
	                	
                    	final Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
	                	emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
	                	emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, audioUri);
	                	emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Test");
	                	emailIntent.setType("audio/*");
	
	                	startActivity(Intent.createChooser(emailIntent, "Senden via"));

Woran könnte das denn liegen?

Ich habe schon ziemlich viele möglichkeiten versucht, nur können die dateien nie angehängt werden, da sie nicht gefunden wurden, obwohl sie vorhanden sind.

Ich danke euch schonmal für die Hilfe.

Gruss
 
Zuletzt bearbeitet:
Soweit ich weiß kann man nicht einfach auf Asset-Dateien zugreifen, weil diese gepackt sind. Ein Zugriff geht nur, indem ich einen Inputstream anlege, die Datei einlese und dann damit weiter arbeite.

Ich hole die Datei, speichere Sie anderweitig ab und arbeite dann mit dieser Kopie weiter.

in etwa sieht das dann so aus:

Code:
AssetManager am = context.getAssets();
InputStream input;
input = am.open("Ziel zu meiner Datei");
File copyFile = new File("Pfad, an den ich die Datei ablegen will");
fos = new FileOutputStream(copyFile);


byte[] buffer = new byte[4096];
					int len;
					while ((len = input.read(buffer)) > 0) {
                        fos.write(buffer, 0, len);
					}

Soweit, ich hoffe das hilft Dir weiter...
 
Will der Mail-Intent aber nicht einfach nur eine URI? Auf Assets kann man doch mit einem speziellen File-Schema zugreifen:
file:///android_asset/...
Einen versuch ist es wert, oder?
 
Na und das ist genau das, was AFAIK nicht funktioniert. Auf alles andere kann ich so zugreifen, aber mit file:///android_asset/... geht das nicht.
 
@buggy84:
Ich vermute, du hast hier ein Verständnis-Problem:
Uri uri=Uri.parse(getAssets()+"sound/"+sound.get(pos).fileName);
ist nicht das Selbe wie
Uri uri=Uri.parse("file:///android_asset/sound/"+sound.get(pos).fileName);

Warum?
#getAssets() (aus derContext-Klasse) gibt dir eine Instanz von AssetManager zurück.
D.h. der AssetManager kann dir einen InputStream oder einen (Asset)FileDescriptor erzeugen, aber nicht per se eine URI.

Ansonsten aber denke ich, wenn das alles nichts bringt, wird der TO nicht um die von dir, buggy84, beschriebene Lösung herum kommen, und die Daten im Storage zwischenzuspeichern. Dann würde ich bei der URI, die man dem Intent immer noch geben muss, aber ein File-Objekt erzeugen und Uri#fromFile(File f) nutzen, anstelle der von Hand gestrickten Variante, oder?
 
Ich verstehe den Unterschied, nur leider, das gebe ich offen zu, hab ich das in der Hast falsch gelesen, bzw. überlesen.

Wenn ich ein File-Objekt erzeugt habe, bietet es sich an, die URI vom Objekt zu erstellen, ganz klar.
 
Vielen Dank für die antworten.
Genau das Problem hatte ich, das ich nicht auf assets Ordner zugreifen kann
Ich habe eine lösung gesucht, das ohne Input-Stream möglich ist.
Da man nicht so einfach darauf zugreifen kann, bleibt mir nichts anderes übrig, als das mit Input-Stream zu lösen und vielen Dank für die Hilfen.

Gruss
 
Naja das ist ja jetzt nicht mehr die Hürde, die Hälfte hast Du quasi schon, den Rest bringt Du auch noch her. Viel Erfolg!
 

Zurück
Oben