截图时,位图返回null

时间:2015-08-27 18:08:53

标签: java android android-fragments bitmap android-bitmap

我正在尝试从片段中获取屏幕截图,但似乎当我这样做时 bitmap = view.getDrawingCache();它返回null。有谁知道为什么会发生这种情况,我该如何解决这个问题?

这是我的代码:

public void takeScreenshot(View view) {
        OutputStream output;

        view = view.getRootView();
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache(true);
        File filepath = Environment.getExternalStorageDirectory();
        File dir = new File(filepath + "/"
                + getString(R.string.app_name) + "/");
        dir.mkdirs();
        File file = new File(dir, getString(R.string.app_name) + ".jpg");
        bitmap = view.getDrawingCache();

        try {
            output = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 80, output);
            output.flush();
            output.close();
            Log.d(TAG, "screenshot saved");
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

并调用该方法 takeScreenshot(getActivity().findViewById(R.id.fragment_container));

这是logCat输出:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.contractfit/com.contractfit.activities.MainActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2413)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
            at android.app.ActivityThread.access$900(ActivityThread.java:175)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5602)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at com.contractfit.fragments.BaseFragment.takeScreenshot(BaseFragment.java:532)
            at com.contractfit.fragments.MainFragment.init(MainFragment.java:211)
            at com.contractfit.fragments.MainFragment.onCreateView(MainFragment.java:116)
            at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
            at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:551)
            at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1177)
            at android.app.Activity.performStart(Activity.java:5461)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2386)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
            at android.app.ActivityThread.access$900(ActivityThread.java:175)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5602)
            at java.lang.reflect.Method.invokeNative(Native Method)

1 个答案:

答案 0 :(得分:0)

考虑这样做,就像Instrumentation测试用例那样,你的代码很接近但有点不同。

来自https://android.googlesource.com/platform/external/droiddriver/+/367267b/src/io/appium/droiddriver/instrumentation/InstrumentationUiDevice.java

获取根视图(如果它是公开的):

context.getDriver().getRootElement().getRawElement()));

截屏

public Bitmap call() {
  Bitmap screenshot;
  rootView.destroyDrawingCache();
  rootView.buildDrawingCache(false);
  Bitmap drawingCache = rootView.getDrawingCache();
  int[] xy = new int[2];
  rootView.getLocationOnScreen(xy);
  if (xy[0] == 0 && xy[1] == 0) {
    screenshot = Bitmap.createBitmap(drawingCache);
  } else {
    Canvas canvas = new Canvas();
    Rect rect = new Rect(0, 0, drawingCache.getWidth(), drawingCache.getHeight());
    rect.offset(xy[0], xy[1]);
    screenshot =
        Bitmap.createBitmap(rect.width() + xy[0], rect.height() + xy[1], Config.ARGB_8888);
    canvas.setBitmap(screenshot);
    canvas.drawBitmap(drawingCache, null, new RectF(rect), null);
    canvas.setBitmap(null);
  }
  rootView.destroyDrawingCache();
  return screenshot;
相关问题