Jetzt kostenlos registrieren. Mitglieder surfen ohne Werbung auf Android-Hilfe.de!
Zurück   Android-Hilfe.de > Android Developer > Android OS Entwicklung / Customize

Screenshot einer Activity erstellen und abspeichern

Das Thema "Screenshot einer Activity erstellen und abspeichern" befindet sich unter Android OS Entwicklung / Customize auf Android-Hilfe.de.


Antwort

 

Themen-Optionen Ansicht
Alt 29.09.2010, 23:10   #1 (permalink)
Moderator
 
Benutzerbild von FelixL

Modell: ZTE San Francisco; Moto Defy; HTC One S

Registriert seit: 26.11.2009
Beiträge: 4.286
Abgegebene Danke: 566
Erhielt 655 Danke für 519 Beiträge
Standard Screenshot einer Activity erstellen und abspeichern

Ich versuche Änderungen am System vorzunehmen, um bei jedem Aufrufen von onPause einen Screenshot der Activity abzuspeichern.

(Der Grund dafür ist eigentlich hier angegeben, falls es jemanden interessiert:
Failed Binder Transaction
Ich will die offizielle Api erhalten, aber trotzdem Screenshots in der vollen Auflösung bekommen.)

Dafür muss ich einige Änderungen im System vornehmen, vor allem in der Datei ActivityThread.java:
android.git.geo.kernel.org Git - platform/frameworks/base.git/blob - core/java/android/app/ActivityThread.java

Das hier sind meine Veränderungen:
Dieser Teil wird aufgerufen wenn die Activity pausiert wird. Ich hab sie in die Funktion performStopActivityInner() eingefügt, direkt hinter
//info.thumbnail = createThumbnailBitmap(r);
(Das ist die deaktivierte offizielle Api.)

Der Code macht nicht viel, er ruft nur eine eigene Funktion für die eigentliche Erstellung des Screenshots auf, und speichert diese Bitmap dann mittels openFileOutput().
Code:
                	Bitmap bigThumbnail = createBigThumbnailBitmap(r);
                	if (bigThumbnail != null){
                		try {
                			   FileOutputStream fos= r.activity.openFileOutput("applicationThumbnail.jpg",
                			      Context.MODE_WORLD_READABLE);

                			   bigThumbnail.compress(Bitmap.CompressFormat.PNG, 90, fos);

                			   fos.flush();
                			   fos.close();
                			   } catch (Exception e) {
                			   Log.e("BigThumbnailAddon", e.toString());
                			}
                	}
Das ist meine veränderte createThumbnailBitmap(r):
Code:
private int mBigThumbnailWidth = -1;
    private int mBigThumbnailHeight = -1;
    
    private final Bitmap createBigThumbnailBitmap(ActivityRecord r) {
        Bitmap bigThumbnail = null;
        try {
            int w = mBigThumbnailWidth;
            int h;
            if (w < 0) {
                Resources res = r.activity.getResources();
                mBigThumbnailHeight = h =
                    res.getDimensionPixelSize(com.android.internal.R.dimen.big_thumbnail_height);

                mBigThumbnailWidth = w =
                    res.getDimensionPixelSize(com.android.internal.R.dimen.big_thumbnail_width);
            } else {
                h = mBigThumbnailHeight;
            }

            // XXX Only set hasAlpha if needed?
            bigThumbnail = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);
            bigThumbnail.eraseColor(0);
            Canvas cv = new Canvas(bigThumbnail);
            if (!r.activity.onCreateThumbnail(bigThumbnail, cv)) {
            	bigThumbnail = null;
            }
        } catch (Exception e) {
            if (!mInstrumentation.onException(r.activity, e)) {
                throw new RuntimeException(
                        "Unable to create bigThumbnail of "
                        + r.intent.getComponent().toShortString()
                        + ": " + e.toString(), e);
            }
            bigThumbnail = null;
        }

        return bigThumbnail;
    }
Was noch zu sagen ist:
ich hab keine Ahnung wie ich ein ganzes Android quasi in Eclipse importieren kann oder sowas, um dort schon mal Fehlermeldungen auszuschließen. Ich hab nur mal die Activity-Tread.java importiert, und die meisten Fehler konnte ich damit erschlagen. Die die jetzt noch angezeigt werden liegen (hoffentlich) an fehlenden Importen und Klassen drumrum.

Jetzt sind für mich allerdings noch einige Fragen offen:
1) Ich will in values.xml in der framework.res zwei weitere Werte hinzufügen.
Dort gibt es schon
thumbnail_width und thumbnail_height
ich will
big_thumbnail_width und big_thumbnail_height
mit einbauen, funktioniert das einfach so das ich sie dort einfach nur hinzufüge und das System findet sie?
Bei einer normalen Android-App ist das ja ähnlich aufgebaut, aber hab ich was vergessen was Eclipse vielleicht automatisch macht?

2) Ich will dann in der Activity die Funktion openFileOutput() aufrufen, die als default in den Ordner data/data/packagename speichert. Andere Funktionen der Activity werden einfach über r.activity.FUNKTION aufgerufen, das sollte dann hier auch so klappen, oder?
Beispiel:
Zeile 3642 r.activity.onDestroy();

Glaubt ihr das funktioniert so?
Ich kompiliere das ganze dann nicht selbst sondern gebe es an Feeyo weiter, ist es ein großer Aufwand das zu machen?

Wäre sehr cool wenn jemand irgendwas dazu sagen kann, da ich mir ein einerseits relativ sicher bin das das funktioniert, sowas aber zum ersten mal mache und es nicht selbst testen kann.

Geändert von FelixL (29.09.2010 um 23:14 Uhr)
FelixL ist offline   Mit Zitat antworten
Alt 30.09.2010, 00:00   #2 (permalink)
Android Guru
 
Benutzerbild von Fr4gg0r

Modell: Samsung Galaxy S (I9000)

Registriert seit: 21.12.2009
Beiträge: 2.572
Abgegebene Danke: 76
Erhielt 506 Danke für 295 Beiträge
Standard AW: Screenshot einer Activity erstellen und abspeichern

befindet sich in /system/framework/core.jar bzw. wenn du kein deodexed rom hast, wovon auszugehen ist, dann in core.odex.
Also zuerst die core.odex deodexen mit baksmali, dann mit smali classes.dex erstellen und in die core.jar packen; anschließend kannst du es mit apktool dekompilieren.

Dann findest du dort irgendwo deine gesuchte Klasse, diese enthält dann aber keinen java code, sondern irgendwas anderes.
Es soll wohl gehen, in diesen code java code einzufügen; anschließend mit apktool wieder kompilieren und aufs Gerät pushen.

Gibt von JesusFreeke (Entwickler von apktool) ein Video dazu auf Youtube.

Achso, du willst dir den Source vom git ziehen und dein eigenes framework bauen..

Geändert von Fr4gg0r (30.09.2010 um 00:06 Uhr)
Fr4gg0r ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei Fr4gg0r für diesen Beitrag:
FelixL (30.09.2010)
Alt 30.09.2010, 00:12   #3 (permalink)
Moderator
 
Benutzerbild von FelixL

Modell: ZTE San Francisco; Moto Defy; HTC One S

Registriert seit: 26.11.2009
Beiträge: 4.286
Abgegebene Danke: 566
Erhielt 655 Danke für 519 Beiträge
Standard AW: Screenshot einer Activity erstellen und abspeichern

Um die Uhrzeit bin ich auch nicht mehr so aufnahmefähig, macht nix
Es war aber ansich schon richtig das ich den Code einfach nur zum Laufen bringen will.
Die baksmali-Variante ist für mich aber quasi raus, da ich ja z.B. den einen Teil meines Codes an der richtigen Stelle einfügen muss, und ich nicht glaube das ich diese finde

Wenn es komplizierter wird den Code zum laufen zu bringen, du aber auch glaubst das das so funktioniert, dann geb ich den anstrengenden Teil einfach an Feeyo ab, der kann das besser :P
FelixL ist offline   Mit Zitat antworten
Alt 30.09.2010, 00:20   #4 (permalink)
Android Guru
 
Benutzerbild von Fr4gg0r

Modell: Samsung Galaxy S (I9000)

Registriert seit: 21.12.2009
Beiträge: 2.572
Abgegebene Danke: 76
Erhielt 506 Danke für 295 Beiträge
Standard AW: Screenshot einer Activity erstellen und abspeichern

ach, Code finden ist eigentlich nicht das hauptproblem.
Du kennst den Code ja von AOSP, und der in deinem handy wird sich wohl davon nicht unterscheiden.

Methodennamen und Variablennamen bleiben nämlich erhalten.
Fr4gg0r ist offline   Mit Zitat antworten
Alt 30.09.2010, 00:27   #5 (permalink)
Moderator
 
Benutzerbild von FelixL

Modell: ZTE San Francisco; Moto Defy; HTC One S

Registriert seit: 26.11.2009
Beiträge: 4.286
Abgegebene Danke: 566
Erhielt 655 Danke für 519 Beiträge
Standard AW: Screenshot einer Activity erstellen und abspeichern

Gut, dann probiere ich diese Variante am Wochenende (vorher leider keine Zeit :/):

Zitat:
Also zuerst die core.odex deodexen mit baksmali, dann mit smali classes.dex erstellen und in die core.jar packen; anschließend kannst du es mit apktool dekompilieren.
Hab auch in dem Code da oben noch vergessen das ich die Werte für die Größe je nach Orientierung (Landscape/Portrait) tauschen muss.
Aber wie gesagt, mal sehen was das Wochenende bringt.
Danke für deine Hilfe.

Nachschlag: Hey, dann kann ich mir am Wochenende ein aktuelles Rom drauf ziehen und muss nicht mehr mit ner älteren Version arbeiten nur weil dort die offizielle Api aktiviert ist. Genial
Wenn das so funktioniert wie du das sagst ist das echt einfach...genial ^^
FelixL ist offline   Mit Zitat antworten
Alt 30.09.2010, 10:54   #6 (permalink)
Moderator
 
Benutzerbild von FelixL

Modell: ZTE San Francisco; Moto Defy; HTC One S

Registriert seit: 26.11.2009
Beiträge: 4.286
Abgegebene Danke: 566
Erhielt 655 Danke für 519 Beiträge
Standard AW: Screenshot einer Activity erstellen und abspeichern

Code:
    private final Bitmap createBigThumbnailBitmap(ActivityRecord r) {
        Bitmap bigThumbnail = null;
        try {
            int w = mBigThumbnailWidth;
            int h;
            Resources res = r.activity.getResources();
            if (w < 0) {
                mBigThumbnailHeight = h =
                    res.getDimensionPixelSize(com.android.internal.R.dimen.big_thumbnail_height);

                mBigThumbnailWidth = w =
                    res.getDimensionPixelSize(com.android.internal.R.dimen.big_thumbnail_width);
            } else {
                h = mBigThumbnailHeight;
            }
            //Swap values depending on orientation:
            if (res.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
            	int tmpSwap = h;
            	h = w;
            	w = tmpSwap;
            }
            // XXX Only set hasAlpha if needed?
            bigThumbnail = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);
            bigThumbnail.eraseColor(0);
            Canvas cv = new Canvas(bigThumbnail);
            if (!r.activity.onCreateThumbnail(bigThumbnail, cv)) {
            	bigThumbnail = null;
            }
        } catch (Exception e) {
            if (!mInstrumentation.onException(r.activity, e)) {
                throw new RuntimeException(
                        "Unable to create bigThumbnail of "
                        + r.intent.getComponent().toShortString()
                        + ": " + e.toString(), e);
            }
            bigThumbnail = null;
        }

        return bigThumbnail;
    }
Jetzt auch orientation-aware
FelixL ist offline   Mit Zitat antworten
Alt 30.09.2010, 14:06   #7 (permalink)
Moderator
 
Benutzerbild von FelixL

Modell: ZTE San Francisco; Moto Defy; HTC One S

Registriert seit: 26.11.2009
Beiträge: 4.286
Abgegebene Danke: 566
Erhielt 655 Danke für 519 Beiträge
Standard AW: Screenshot einer Activity erstellen und abspeichern

Das Rom ist anscheinend deodexed, eine core.odex findet er nicht, dafür aber die core.jar, die auch eine classes.dex enthält. Wenn ich jetzt noch den Code finden würde

Im Ernst, hast du ne Ahnung in welcher Unterdatei das das sein könnte? Ich finde da Haufenweise allgemeinen Java-Zeug, aber nichts was nach Android aussieht...ausser einem Dalvik-Verzeichnis.
Kann ich dir die core.jar mal schicken?
FelixL ist offline   Mit Zitat antworten
Alt 30.09.2010, 14:08   #8 (permalink)
Android Guru
 
Benutzerbild von Fr4gg0r

Modell: Samsung Galaxy S (I9000)

Registriert seit: 21.12.2009
Beiträge: 2.572
Abgegebene Danke: 76
Erhielt 506 Danke für 295 Beiträge
Standard AW: Screenshot einer Activity erstellen und abspeichern

ist doch gut, wenn es ein deodexed rom ist.
Dann einfach mit apktool dekompilieren.
Anschließend hast du einen Ordner mit dem ganzen Code unso.
Anschließend hast du für jedes Package einen Ordner.. also java, android, app, etc. und in diesen befinden sich die .smali files.
Fr4gg0r ist offline   Mit Zitat antworten
Alt 30.09.2010, 16:43   #9 (permalink)
Moderator
 
Benutzerbild von FelixL

Modell: ZTE San Francisco; Moto Defy; HTC One S

Registriert seit: 26.11.2009
Beiträge: 4.286
Abgegebene Danke: 566
Erhielt 655 Danke für 519 Beiträge
Standard AW: Screenshot einer Activity erstellen und abspeichern

Ja, apktool hatte ich schon benutzt, hatte mir das mal so erschlossen das die ersten Schritte einfach wegfallen

Ordnerstruktur:
-apktool.yml
-smali
com
dalvik
java
javax
junit
org
SQLite
sun

Um nur mal die obersten Ordner zu zeigen.
Manche haben noch Unterordner, in manchen sind auch direkt die smali-Dateien.
Aber wie gesagt, ich finde nichts was in die Richtung Android oder ActivityThread gehen könnte :/
FelixL ist offline   Mit Zitat antworten
Alt 30.09.2010, 16:45   #10 (permalink)
Android Guru
 
Benutzerbild von Fr4gg0r

Modell: Samsung Galaxy S (I9000)

Registriert seit: 21.12.2009
Beiträge: 2.572
Abgegebene Danke: 76
Erhielt 506 Danke für 295 Beiträge
Standard AW: Screenshot einer Activity erstellen und abspeichern

haha
ich will mich gerade auch dort zu schaffen machen (an der Activity.java) und finde die auch nicht in der core.jar

Edit: habs. guck in die framework.jar

Geändert von Fr4gg0r (30.09.2010 um 16:48 Uhr)
Fr4gg0r ist offline   Mit Zitat antworten
Antwort

Stichworte
-

Themen-Optionen
Ansicht


Ähnliche Themen

Thema Autor Forum Antworten Letzter Beitrag
Screenshot erstellen xinon82 Samsung Galaxy S (I9000) Forum 41 21.08.2011 01:14
Ergebnis einer Activity bekommen? TobiTobsen Android App Entwicklung 6 09.08.2011 20:31
Screenshot erstellen ? BenBase HTC Desire Forum 1 07.05.2010 22:12
Screenshot mit Nexus One erstellen, wie? unixbyte Nexus One Forum 1 04.02.2010 12:50
Wert einer Activity übergeben! Manfred Android App Entwicklung 2 04.02.2009 14:26




Du liest gerade: "Screenshot einer Activity erstellen und abspeichern" unter "Android OS Entwicklung / Customize" auf Android-Hilfe.de.


Powered by vBulletin®
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
© Android-Hilfe.de 2012 - All rights reserved.