German Aktion durchführen mit

Peter128

Member
Licensed User
Longtime User
Hallo Wie bringe ich meine Anwendung in die Liste, welche Dateiendungen mit Anwendungen verknüpft. Ich habe eine App erstellt mit der man beliebige Dokumente im internen Netz zu einem Windows-Rechner senden kann, um sie entweder zu drucken oder weiter zu bearbeiten. Nun wäre es sinnvoll, wenn der Dateimanager, bei klick auf eine Anwendung, dem Anwender die Möglichkeit gibt, die Datei zusenden usw.
Schön wäre ein komplettes Beispiel.:sign0085::sign0085::sign0085::sign0085::sign0085::sign0085:

Gruß Peter
 

cmweb

Active Member
Licensed User
Longtime User
Für sowas sind m. E. die intent-filter da.

B4X:
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>

Das wird einfach im Manifest eingetragen...

Herzliche Grüße

Carsten
 

Peter128

Member
Licensed User
Longtime User
Nix passiert

Hallo Carsten.
Danke für die schnelle Antwort. Ich habe den Code mit dem Manifest-Editor eingefügt und die Anwendung gestartet.
Wenn ich jetzt mit dem Dateimanager ein "image" anklicke müsste doch mein Programm mit in der Auswahlliste sein ... oder ??
:sign0085:

Gruß Peter
 

cmweb

Active Member
Licensed User
Longtime User
Hallo Carsten.
Danke für die schnelle Antwort. Ich habe den Code mit dem Manifest-Editor eingefügt und die Anwendung gestartet.
Wenn ich jetzt mit dem Dateimanager ein "image" anklicke müsste doch mein Programm mit in der Auswahlliste sein ... oder ??
:sign0085:

Gruß Peter
So die Theorie... bzw. womöglich auch im SHARE/Teilen/Senden als...

Wie hast Du die Zeilen denn eingefügt?

Ich vermute, das sie so eingefügt werden müssen:

B4X:
AddApplicationText(
 <intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
)

Herzliche Grüße

Carsten
 
Last edited:

Peter128

Member
Licensed User
Longtime User
Geht auch nicht

Hallo Carsten !
Abermals Danke. Aber auch diese Variante funktioniert nicht. Ich habe auch das englischsprachige Forum durchsucht, aber speziell zu dieser Problematik gibt es kaum Aussagen oder Beispiele.:BangHead: Die Erklärungen zu intent-filter begreife ich nicht wirklich. Ich bin da mehr der Praktik(er) oder (ant). Es wird aber Zeit, dass diese Problematik aufzulösen. Hast Du noch mehr Ideen ? :sign0085::sign0085::sign0085: Oder ist da draussen unter den vielen Leuten jemand, der die Lösung hat :wav:

Mit besten Grüßen
Peter
 

cmweb

Active Member
Licensed User
Longtime User
Hi,

also bei mir funktioniert es.

Hast Du die Zeile <action android... auch entsprechend für Deine aufzurufende Activity abgeändert?

Da muss dann stehen:

<activity android:name="dein.paket.name.main" >

(wenn Deine Haupt-Activity "main" heißt und diese aufgerufen werden soll).

Herzliche Grüße

Carsten
 

Peter128

Member
Licensed User
Longtime User
Bitte etwas genauer

Hallo Carsten. Erst mal Danke für Deine Bemühungen:sign0188:, aber jetzt sehe ich gar nicht mehr durch. Wo steht Activity android:name= ........?:BangHead:
Bitte eine Erläuterung für solche Deppen wie mich. Was muss wo stehen, damit das Ganze funktioniert. Entschuldige :sign0013: wenn ich Dich nochmal nerv'.
Aber wie gesagt: Mit dem Indent-Filter komme ich nicht zurecht.

Ich danke Dir schon mal für Deine Geduld.;)
Gruss Peter
 

cmweb

Active Member
Licensed User
Longtime User
Hi Peter,

Hallo Carsten. Erst mal Danke für Deine Bemühungen:sign0188:, aber jetzt sehe ich gar nicht mehr durch. Wo steht Activity android:name= ........?:BangHead:
Bitte eine Erläuterung für solche Deppen wie mich. Was muss wo stehen, damit das Ganze funktioniert. Entschuldige :sign0013: wenn ich Dich nochmal nerv'.
Aber wie gesagt: Mit dem Indent-Filter komme ich nicht zurecht.

Ich danke Dir schon mal für Deine Geduld.;)
Gruss Peter
sorry, mein Fehler. Ich hatte offenbar die Hälfte vergessen.

Das hier ist das komplette Zeugs, wie es in den Manifest Editor einzutragen ist (ich hatte es bei mir direkt ins Manifest geschrieben):

B4X:
AddApplicationText(
<activity android:name="dein.paket.name.main" >
      <intent-filter>
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <data android:mimeType="image/*" />
      </intent-filter>
    </activity>
)

In der zweiten Zeile müsstest Du halt den Paketnamen und die aufzurufende Activity ersetzen, falls es halt nicht "Main" sein soll....

Im AndroidManifest.xml sollte das dann hinterher so aussehen:

B4X:
<activity android:name="dein.paket.name.main" >
      <intent-filter>
      <action android:name="android.intent.action.SEND" />
      <category android:name="android.intent.category.DEFAULT" />
      <data android:mimeType="image/*" />
      </intent-filter>
    </activity>

Herzliche Grüße

Carsten

Herzliche Grüße

Carsten
 
Last edited:

cmweb

Active Member
Licensed User
Longtime User
Nachtrag:

android.intent.action.SEND ist dabei für das SHARE Menü (Teilen/Senden via, ...).

Wenn Du

android.intent.action.VIEW nimmst, ist es das OPEN WITH Menü (das, was Du eigentlich haben wolltest).

Die nächste Frage, die sich stellt, ist dann: Wie kommt die App nun an die Daten (z. B. den Dateinamen der Grafik, um im Beispiel Images zu bleiben).

Das versuche ich heute mal rauszufinden...

Muss irgendwas mit Activity.GetStartingIntent zu tun haben... Aber so richtig schlau bin ich da noch nicht geworden...

Herzliche Grüße

Carsten
 

cmweb

Active Member
Licensed User
Longtime User
Hi,

okay, ich habe es jetzt auch geschafft, den Pfadnamen der Grafik auszuwerten.

Ich hänge mal ein kleines B4A Projekt an, das eine App darstellt, die sich in das "Open With" einklinkt (als "Android INTENTS" App) und in der Lage ist, Grafiken (Images) entgegenzunehmen.

Das Projekt benötigt die Libraries Reflection und SQL.

Herzliche Grüße

Carsten
 

Attachments

  • intents.zip
    6.9 KB · Views: 219

Peter128

Member
Licensed User
Longtime User
Vielen Dank Carsten

Hallo Carsten :sign0188::sign0098:

Vielen Dank für all Deine Mühen. Genau so sollte es funktionieren:sign0060::sign0060::sign0060:
Ich danke Dir für Deine Geduld. Ich denke viele User werden Dein Beispiel nutzen und in ihre Anwendungen einbauen. Ein dickes Bienchen für Carsten.

Mit besten Grüßen
Peter
 

cmweb

Active Member
Licensed User
Longtime User
Gern geschehen, ich wollte das auch selbst mal wissen, weil ich das für sehr nützlich und zahllosen Fällen halte.

Interessanterweise wird dieses Thema hier im Forum nirgendwo sonst so richtig behandelt.

Also entweder die meisten kriegen das völlig problemlos hin und wir beide sind die einzigen, die da Schwierigkeiten haben.

Oder niemand nutzt das bisher...?!

Herzliche Grüße

Carsten

Gesendet von meinem GT-N7000 mit Tapatalk 2
 

Peter128

Member
Licensed User
Longtime User
Nochmals Dank an Carsten

Hallo Carsten ...
Nochmals Danke für Deine Mühe.:sign0188: Ohne Dich hätte ich diese Problematik nicht geschafft.
"GetPathFromContentResult(UriString As String) As String" erzeugt aber eine Fehlermeldung. Wobei mir der Sinn nicht ganz klar ist. Weil ... den Dateinamen erhält man ja mit "int1.GetData" auch, und mehr braucht man ja nicht oder ?
Auf jeden Fall meinen Respekt hast Du zu 100%.

Mit besten Grüßen
Peter
 

Peter128

Member
Licensed User
Longtime User
Ein Schönheitsfehler bleibt

Hallo Carsten
selbst auf die Gefahr hin, dass es langsam lästig wird:sign0013:, ensteht folgendes Problem:
Wenn ich den Mimetype ändere auf eine Dateiendung, die bereits durch andere Anwendungen verarbeitet werden kann, erscheint mein Programm nicht in der Liste.
Also wenn ich Image setze wird eine Liste angezeigt in der mein Programm ist und die Galerie. Ändere ich den MIME-Type auf Application/ *.xml erscheint eine Liste der bisher Verknüpften Programme. Mein Programm ist darin nicht enthalten.:BangHead:
Eventuell hast Du eine Idee ?:sign0085:

Gruß Peter
 

cmweb

Active Member
Licensed User
Longtime User
Hallo Carsten ...
Nochmals Danke für Deine Mühe.:sign0188: Ohne Dich hätte ich diese Problematik nicht geschafft.
"GetPathFromContentResult(UriString As String) As String" erzeugt aber eine Fehlermeldung. Wobei mir der Sinn nicht ganz klar ist. Weil ... den Dateinamen erhält man ja mit "int1.GetData" auch, und mehr braucht man ja nicht oder ?
Auf jeden Fall meinen Respekt hast Du zu 100%.

Mit besten Grüßen
Peter

Im GetData ist leider nicht der Dateiname und -pfad, sondern irgendein Content Dingens. Deshalb GetPathFromContentResult. Funktioniert allerdings nur mit Images. Geht das bei Dir nicht?

Welche Fehlermeldung kommt da?

Herzliche Grüße

Carsten

Gesendet von meinem GT-N7000 mit Tapatalk 2
 

cmweb

Active Member
Licensed User
Longtime User
Wie das mit XML Dateien geht, weiß ich nicht. Müsste ich mir auch erstmal anschauen...

Herzliche Grüße

Carsten

Gesendet von meinem GT-N7000 mit Tapatalk 2
 

Peter128

Member
Licensed User
Longtime User
Hallo Carsten
Also bei int1.getdata steckt bei mir der komplette dateiname drin.Android 4.0.3
Die komplette Fehlegrmeldung von der sub sende ich Dir morgen. Eventuell kannst Du mehr damit anfangen.Heute muss ich aufhoeren, weil auf dem Tablet schreibt sichs nicht so gut.
bis morgen
gruss peter
 

cmweb

Active Member
Licensed User
Longtime User
Hi Peter,

also bei mir steht da sowas ähnliches wie ein Pfad. Aber es ist nicht der Dateipfad.

Probiere doch mal, diesen in GetData genannten Pfad zur Anzeige der Grafik zu benutzen...

Herzliche Grüße

Carsten
 

Peter128

Member
Licensed User
Longtime User
Guten Morgen

Hi Carsten ;)
Bei mir steckt da wirklich der Dateiname drin.

dname=dateiname(int1.GetData)
ord=ordner(int1.GetData)
ord=ord.Replace("file:///","")
ImageView1.Bitmap=LoadBitmap(ord,dname)

IMAGE WIRD ANGEZEIGT

Sub ordner(name As String) As String
'ermittelt aus dem kompletten datei-namen den Ordnername
Dim s As String
s = name
Dim filename, folder As String
Dim i As Int
i = s.LastIndexOf("/")
filename = s.SubString(i + 1)
folder = s.SubString2(0, i)
Log(folder)
Log(filename)
Return folder
End Sub

Sub dateiname(name As String) As String
'ermittelt aus dem kompletten datei-namen den dateinamen
Dim s As String
s = name
Dim filename, folder As String
Dim i As Int
i = s.LastIndexOf("/")
filename = s.SubString(i + 1)
folder = s.SubString2(0, i)
Log(folder)
Log(filename)
Return filename
End Sub


Geht eben nur mit Image.
Hier die Fehlermeldung von "GetPathFromContentResult(UriString As String) As String

An errror has occurred in sub:
main_getpathfromcontententresult (java line:274) java.lang.RuntimeExeption:Object should first be initialized(Cursor).

Ich dachte an dieser Stelle ich brauch die getpathfrom... gar nicht.
Funktioniert mit Image eiwandfrei.
Mittlerweile hat sich aber gezeigt, dass es mit anderen Dateien (xml,txt...)
wahrscheinlich nicht funktioniert.D.h. die Verknüpfung mit der "Aktion ausführen mit" - Liste geht mit anderen Dateiendungen nicht.:BangHead:
Eventuell hast Du eine Idee ...

Gruß
Peter
 

cmweb

Active Member
Licensed User
Longtime User
Hi Peter,

Bei mir steckt da wirklich der Dateiname drin.

dname=dateiname(int1.GetData)
ord=ordner(int1.GetData)
ord=ord.Replace("file:///","")
ImageView1.Bitmap=LoadBitmap(ord,dname)

IMAGE WIRD ANGEZEIGT
Hochinteressant.

Bei mir steht da sowas drin:

content://media/external/images/media/63644

Und die Sub GetPathFromContentResult ermittelt daraus eben den richtigen Dateinamen und Pfad:

/mnt/sdcard/external_sd/DCIM/Camera/20120429_162751.jpg

Das GetPathFromContentResult habe ich übrigens von Erel geklaut, der hat das in einem anderen Thread hier irgendwo mal gepostet.

EDIT:
Ahhhh.... okay... jetzt sehe ich, woran das liegt.

Ich habe getestet, indem ich die Grafikdatei im Samsung-eigenen Dateimanager "Eigene Dateien" angeklickt habe. Dann erhalte ich das "content://...." Zeugs.

Jetzt habe ich mal einen anderen Dateimanager ausprobiert (ES Datei Explorer), und über den bekome ich - wie Du - den file:/// Dateipfad.

Also, Erkenntnis: Dummerweise ist leider nicht verlässlich, welche Art von Daten in "GetData" drin stecken.

Das heißt, Du musst in Deiner App sämtliche möglichen Varianten irgendwie idividuell behandeln.

Das GetPathFromContentResult geht natürlich nicht mit file:/// Inhalt, sondern nur mit content:// Inhalt.

Soweit zur Behandlung von Images...

Zu anderen Dateitypen kann ich noch nichts sagen....

Herzliche Grüße

Carsten
 
Top