Skip to content

Instantly share code, notes, and snippets.

@ertos12
Forked from stuartjmoore/gist:3067159
Created July 11, 2014 07:55
Show Gist options
  • Save ertos12/bd77d0cedaac4d54f749 to your computer and use it in GitHub Desktop.
Save ertos12/bd77d0cedaac4d54f749 to your computer and use it in GitHub Desktop.
/*
* 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