-
-
Save ertos12/bd77d0cedaac4d54f749 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* This code doesn't work, I'm hoping for some help. | |
* | |
* I'm trying to use reflection to dig into Android's @hide classes that store screenshots | |
* of the currently running apps. | |
* | |
* The code compiles and runs perfectly, but mThumbnailReceiver is never called back with | |
* the bitmaps. | |
* | |
* I've never done Android development before (I'm an iOS dev) but I'd love to get this | |
* (or any other thumbnail code) to work for a personal project I'm starting. Any and all | |
* help is welcome. | |
* | |
* I've spent hours on Google looking for other people who've done the same thing, no one | |
* has without modifying their ROM. | |
* | |
* Google's working source code for reference | |
* The recent tasks app calling the thumbnails: http://androidxref.com/4.0.4/xref/frameworks/ex/carousel/test/src/com/android/carouseltest/TaskSwitcherActivity.java#245 | |
* | |
* The callback it uses: http://androidxref.com/4.0.4/xref/frameworks/ex/carousel/test/src/com/android/carouseltest/TaskSwitcherActivity.java#167 | |
* | |
* The IThumbnailReceiver class: http://code.google.com/p/coffee/source/browse/trunk/froyo/android/android/app/IThumbnailReceiver.java?r=392 | |
*/ | |
try | |
{ | |
ActivityManager am = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE); | |
Class IThumbnailReceiver = Class.forName("android.app.IThumbnailReceiver"); | |
Class StubClass = Class.forName("android.app.IThumbnailReceiver$Stub"); | |
java.lang.reflect.Constructor stub = StubClass.getConstructor(); | |
Object mThumbnailReceiver = java.lang.reflect.Proxy.newProxyInstance(IThumbnailReceiver.getClassLoader(), new java.lang.Class[]{IThumbnailReceiver}, new java.lang.reflect.InvocationHandler() | |
{ | |
@Override | |
public Object invoke(Object proxy, java.lang.reflect.Method method, Object[] args) throws java.lang.Throwable | |
{ | |
Log.d(LOG_TAG, "invoke method: " + method.getName()); | |
String method_name = method.getName(); | |
Class<?>[] classes = method.getParameterTypes(); | |
if(method_name.equals("finished")) | |
{ | |
} | |
else if(method_name.equals("newThumbnail")) | |
{ | |
Bitmap bitmap = (Bitmap)args[1]; | |
int w = bitmap.getWidth(); | |
int h = bitmap.getHeight(); | |
Log.d(LOG_TAG, "New thumbnail for id=" + args[0] + ", dimensions=" + w + "x" + h + " description '" + args[2] + "'"); | |
} | |
else if(method_name.equals("asBinder")) | |
{ | |
} | |
return null; | |
} | |
}); | |
Class c = Class.forName("android.app.ActivityManager"); | |
Class[] args = new Class[3]; | |
args[0] = Integer.TYPE; | |
args[1] = Integer.TYPE; | |
args[2] = Class.forName("android.app.IThumbnailReceiver"); | |
java.lang.reflect.Method method = c.getMethod("getRunningTasks", args); | |
Object[] input = {new Integer(5), new Integer(0), mThumbnailReceiver}; | |
List<ActivityManager.RunningTaskInfo> lru = (List<ActivityManager.RunningTaskInfo>)method.invoke(am, input); | |
for(ActivityManager.RunningTaskInfo rti : lru) | |
{ | |
Log.d(LOG_TAG, "LRU: " + rti.topActivity.getClassName()); | |
Bitmap b = rti.thumbnail; | |
if(b != null) | |
{ | |
Log.d(LOG_TAG, " Bitmap found: " + b); | |
} | |
else | |
{ | |
Log.d(LOG_TAG, " Bitmap is null"); | |
} | |
} | |
} | |
catch(Exception e) | |
{ | |
Log.d(LOG_TAG, "Exception" + e); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment