其实这里利用了一个小技巧啦~就是通过application类中的registerActivityLifecycleCallbacks,去存储了当前正在运行的activity来实现的。(本质还是依赖于activity,但是更加灵活)
首先,在自己的application类的oncreate方法中加入
public class BSApp extends Application {
@Override
public void onCreate() {
super.onCreate();
...
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityStopped(Activity arg0) {
// TODO Auto-generated method stub
}
@Override
public void onActivityStarted(Activity arg0) {
// TODO Auto-generated method stub
}
@Override
public void onActivitySaveInstanceState(Activity arg0, Bundle arg1) {
// TODO Auto-generated method stub
}
@Override
public void onActivityResumed(Activity activity) {
BSActivityManager.getInstance().setCurrentActivity(activity);
}
@Override
public void onActivityPaused(Activity arg0) {
// TODO Auto-generated method stub
}
@Override
public void onActivityDestroyed(Activity arg0) {
// TODO Auto-generated method stub
}
@Override
public void onActivityCreated(Activity arg0, Bundle arg1) {
// TODO Auto-generated method stub
}
});
}
然后写一个BSActivityManager类
public class BSActivityManager {
private static BSActivityManager sInstance = new BSActivityManager();
private WeakReference<Activity> sCurrentActivityWeakRef;
private BSActivityManager() {
}
public static BSActivityManager getInstance() {
return sInstance;
}
public Activity getCurrentActivity() {
Activity currentActivity = null;
if (sCurrentActivityWeakRef != null) {
currentActivity = sCurrentActivityWeakRef.get();
}
return currentActivity;
}
public void setCurrentActivity(Activity activity) {
sCurrentActivityWeakRef = new WeakReference<Activity>(activity);
}
}
然后正常截图工具类
public class ScreenUtil {
public static Bitmap GetandSaveCurrentImage(Activity act) {
// 1.构建Bitmap
WindowManager windowManager = act.getWindowManager();
Display display = windowManager.getDefaultDisplay();
int w = display.getWidth();
int h = display.getHeight();
Bitmap Bmp = Bitmap.createBitmap(w, h, Config.ARGB_8888);
// 2.获取屏幕
View decorview = act.getWindow().getDecorView();
decorview.setDrawingCacheEnabled(true);
Bmp = decorview.getDrawingCache();
// 3.保存Bitmap
try {
File path = new File(AppConfig.getInstance().APP_PATH_ROOT);
// 文件
String filepath = AppConfig.getInstance().APP_PATH_ROOT
+ "/Screen_1.png";
File file = new File(filepath);
if (!path.exists()) {
path.mkdirs();
}
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fos = null;
fos = new FileOutputStream(file);
if (null != fos) {
Bmp.compress(Bitmap.CompressFormat.PNG, 90, fos);
fos.flush();
fos.close();
Toast.makeText(act, "截屏文件已保存至SDCard/BsAppConfig/下",
Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
e.printStackTrace();
}
return Bmp;
}
public static String Bitmap2StrByBase64(Bitmap bit) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bit.compress(CompressFormat.JPEG, 40, bos);// 参数100表示不压缩
byte[] bytes = bos.toByteArray();
return Base64.encodeToString(bytes, Base64.DEFAULT);
}
}
最后在想截图的地方
currActivity = BSActivityManager.getInstance().getCurrentActivity();
Bitmap crash_img = ScreenUtil.GetandSaveCurrentImage(currActivity);
String crash_img_base64 = ScreenUtil.Bitmap2StrByBase64(crash_img);
直接这样写,即可! 很方便吧~
感谢
http://blog.youkuaiyun.com/cjyusha/article/details/51274075
的原作者,受到了你的启发~