3 Stimmen

Android onActivityResult NEVER aufgerufen

Meine onActivityResult-Methode wird nie aufgerufen. Ich verwende Android 2.2

Ich verwende einen Tabhost, bei dem TabHosts TabGroups enthalten, die wiederum einzelne Aktivitäten enthalten.

Eine meiner individuellen Aktivitäten hat folgende Absicht

 Intent intent = new Intent(); 
 intent.setType("image/*");
 intent.setAction(Intent.ACTION_GET_CONTENT);
 startActivityForResult(Intent.createChooser(intent,
                    "Select Picture"), 0);

dies lädt meine Galerie-Apps, ich verwende die Standard-Android-Galerie, um ein Bild auszuwählen, und wenn ich meine onActivityResult zurückkehren, ist meine Aktivität nicht aufgerufen.

Es sieht wie folgt aus - und ich habe einen Haltepunkt bei if(resultCode == 0) Daher sollte die Logik meines onActivityResults im Moment keine Rolle spielen.

 public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == 0) {
        if (requestCode == 0) {
            Uri selectedImageUri = data.getData();

            //OI FILE Manager
            filemanagerstring = selectedImageUri.getPath();

            //MEDIA GALLERY
            selectedImagePath = getPath(selectedImageUri);

            //DEBUG PURPOSE - you can delete this if you want
            if(selectedImagePath!=null)
                System.out.println(selectedImagePath);
            else System.out.println("selectedImagePath is null");
            if(filemanagerstring!=null)
                System.out.println(filemanagerstring);
            else System.out.println("filemanagerstring is null");

            //NOW WE HAVE OUR WANTED STRING
            if(selectedImagePath!=null)
                System.out.println("selectedImagePath is the right one for you!");
            else
                System.out.println("filemanagerstring is the right one for you!");
        }
    }
}

Lifecycle-Funktionen werden oft in unregelmäßigen Abständen für Aktivitäten innerhalb eines Tabhosts/einer Tabgroup aufgerufen. Daher habe ich überprüft, welche Lifecycle-Funktionen nach dem Schließen der Galerie aufgerufen werden (dies geschieht, sobald ich ein Bild in der Android-Galerie auswähle)

Der einzige, der aufgerufen wird, ist der onResume() in meiner TabHost-Aktivität. Also habe ich versucht, genau die gleiche onActivityResult() Methode in meiner TabHost-Klasse UND in der TabActivity-Klasse. Mit einem Haltepunkt an der gleichen Stelle am Anfang der Methode.

Keine dieser beiden Klassen wird aufgerufen.

Wie kann ich das Ergebnis aus der Galerie-App in meiner App erhalten, wenn keine der eingebauten Empfangsmethoden darauf reagiert?

Da ich weiß, dass mein Haupt-TabHost die onResume() aufgerufen, habe ich versucht, hinzugefügt Intent graphics = getIntent(); um zu sehen, ob es Daten von der Galerieauswahl erhalten würde, tut es nicht, also sehe ich nicht, wie ich die Logik in der onResume()-Methode entweder tun kann.

Lösungen willkommen! :)

18voto

Valer Dragos Punkte 416

Versuchen Sie, startActivityForResult mit dem Kontext der Tabgroup-Aktivität aufzurufen, die Ihre aktuelle Aktivität enthält, und hören Sie dann in der Tabgroup-Aktivität zu.

Verwenden Sie dies, um die tabGroupActivity zu erhalten:

TabGroupActivity parentActivity = (TabGroupActivity)getParent();

Und rufen Sie dann startActivityForResult von dort aus auf:

parentActivity.startActivityForResult(...);

Schließlich setzen Sie einen onActivityResult-Listener in die tabGroupActivity:

protected void onActivityResult(int requestCode, int resultCode,Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
    }

16voto

devdanke Punkte 1177

Nach den vielen Fragen wie dieser zu urteilen, gibt es viele Gründe, warum eine aufgerufene Aktivität nicht die onActivityResult() Methode.

Ein Grund, den ich gefunden habe, war, als ich anrief startActivityForResult(intent, requestCode) , mit einer requestCode Wert von weniger als 0. Meine Anwendung benötigte keine requestCode und in der Android-Dokumentation steht, dass die Verwendung von < 0 keine requestCode .

In den Android-Dokumenten wurde jedoch nicht erwähnt, welche Folgen eine requestCode < 0. Dies hat zur Folge, dass der Anrufer nicht mehr die onActivityResult() Methode nicht mehr aufgerufen wird! Autsch!

Selbst wenn Ihre Anwendung also keine requestCode verwenden, sollten Sie dennoch eine mit einem Wert >= 0 verwenden.

Das habe ich heute gelernt:-)

4voto

CQM Punkte 39840

Die Lösung besteht darin, eine transparente Aktivität über der Hauptaktivität aufzurufen. Diese transparente Aktivität befindet sich vor dem Tabhost und hat normale Lebenszyklusfunktionen.

Diese transparente Aktivität ruft die Galerieabsicht onCreate() auf, sie bekommt alles wie gewohnt in ihrem onActivityResult zurück und Sie können die zurückgegebenen Informationen wie gewohnt an den Rest der App weitergeben. finish() befindet sich innerhalb der onActivityResult-Methode, so dass der Benutzer nicht einmal merkt, dass eine transparente Aktivität aufgerufen wurde.

Update aus den Kommentaren kopiert:

Aktivität A ruft Aktivität B über die normale Absicht an. Aktivität B hat kein xml und führt onCreate wie folgt aus

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

    Intent intent = new Intent(Intent.ACTION_PICK); 
    intent.setType("image/*"); startActivityForResult(intent, 0);

}//end onCreate 

und wenn Aktivität C beendet ist, ruft sie das onActivityResult von Aktivität B auf

2voto

Android Dev Punkte 1339

Sie müssen nur die android:noHistory="true" dieses Formular Ihre Manifestdatei.

1voto

dymmeh Punkte 22067

Verwenden Sie die konstanten Werte für die Ergebniscodes:

Activity.RESULT_OK und Aktivität.ERGEBNIS_CANCELED

Sie werden sehen, dass der Wert für cancelled tatsächlich 0 ist. In Ihrem Code prüfen Sie also, ob die Aktivität abgebrochen wurde.

ändern Sie Ihren Code in

if (resultCode == Activity.RESULT_OK) {
...
}

Ändern Sie zusätzlich Ihre Absichtsaktion in "Intent":

intent.setAction(Intent.ACTION_PICK);

Wenn Sie dies tun, können Sie einfach

    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType("image/*");
    startActivityForResult(intent, 0); 

anstatt den Chooser zu erstellen. Es wählt automatisch die Aktivitäten aus, die mit dieser Absicht und diesem Mimetyp verbunden sind, und zeigt sie Ihnen an

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X