FelixL
Ehrenmitglied
- 821
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:
https://www.android-hilfe.de/forum/android-app-entwicklung.9/failed-binder-transaction.46480.html
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().
Das ist meine veränderte createThumbnailBitmap(r):
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.
(Der Grund dafür ist eigentlich hier angegeben, falls es jemanden interessiert:
https://www.android-hilfe.de/forum/android-app-entwicklung.9/failed-binder-transaction.46480.html
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.
Zuletzt bearbeitet: