Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 截图时位图返回空值_Java_Android_Android Fragments_Bitmap_Android Bitmap - Fatal编程技术网

Java 截图时位图返回空值

Java 截图时位图返回空值,java,android,android-fragments,bitmap,android-bitmap,Java,Android,Android Fragments,Bitmap,Android Bitmap,我试图从一个片段中获得一个截图,但似乎当我这样做的时候 位图=view.getDrawingCache;它返回null。有人知道为什么会发生这种情况吗?我该如何解决 这是我的密码: public void takeScreenshot(View view) { OutputStream output; view = view.getRootView(); view.setDrawingCacheEnabled(true); vie

我试图从一个片段中获得一个截图,但似乎当我这样做的时候 位图=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();
        }
    }
并调用该方法 takeScreenshotgetActivity.findViewByIdR.id.fragment_容器

这是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)

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

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

截图


@njzk2在我看来不像是一个复制品,他清楚地知道npe是什么。@JohanShogun我知道,我撤回了投票结果,没有看到评论Stayedallright,如果删除获取根视图的行并在您的视图上运行代码会怎么样?
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;