Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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 I';我在发送屏幕截图时出错_Java_Android - Fatal编程技术网

Java I';我在发送屏幕截图时出错

Java I';我在发送屏幕截图时出错,java,android,Java,Android,当用户点击按钮时,我要求他拍摄一个屏幕截图并发送给另一个朋友 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { View rootView = getWindow().getDecorView().findViewById(android.R.id.content); Bi

当用户点击按钮时,我要求他拍摄一个屏幕截图并发送给另一个朋友

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            View rootView = getWindow().getDecorView().findViewById(android.R.id.content);
            Bitmap bitmap = getScreenShot(rootView);
            File file = store(bitmap,"File-Name");
            shareImage(file);
        }
    });

public static Bitmap getScreenShot(View view) {
    View screenView = view.getRootView();
    screenView.setDrawingCacheEnabled(true);
    Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
    screenView.setDrawingCacheEnabled(false);
    return bitmap;
}

public static File store(Bitmap bm, String fileName){
    final String dirPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Screenshots";
    File dir = new File(dirPath);
    if(!dir.exists())
        dir.mkdirs();
    File file = new File(dirPath, fileName);
    try {
        FileOutputStream fOut = new FileOutputStream(file);
        bm.compress(Bitmap.CompressFormat.PNG, 85, fOut);
        fOut.flush();
        fOut.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return file;
}
private void shareImage(File file){
    Uri uri = Uri.fromFile(file);
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_SEND);
    intent.setType("image/*");

    intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "");
    intent.putExtra(android.content.Intent.EXTRA_TEXT, "");
    intent.putExtra(Intent.EXTRA_STREAM, uri);
    try {
        startActivity(Intent.createChooser(intent, "Share Screenshot"));
    } catch (ActivityNotFoundException e) {
        Toast.makeText(this, "No App Available", Toast.LENGTH_SHORT).show();
    }
}
调试时,我看到位图值为“”。我的错误消息中也有这些

我在清单文件中使用了它们

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_path" />
</provider>


你能帮我吗?

你应该使用这个代码

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                View rootView = getWindow().getDecorView().findViewById(android.R.id.content);
                Bitmap bitmap = getScreenShot(rootView);
                File file = store(bitmap, "name.png");

                if (file.exists()) {
                    shareImage(file);
                } else {
                    Log.e("file exist", "NO");
                }
            }
        });



    public static Bitmap getScreenShot(View view) {
        View screenView = view.getRootView();
        screenView.setDrawingCacheEnabled(true);
        Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
        screenView.setDrawingCacheEnabled(false);
        return bitmap;
    }

    public File store(Bitmap bm, String fileName) {
        final String dirPath = getExternalCacheDir().getAbsolutePath() + "/Screenshots";
        File dir = new File(dirPath);
        if (!dir.exists())
            dir.mkdirs();
        File file = new File(dirPath, fileName);
        try {
            FileOutputStream fOut = new FileOutputStream(file);
            bm.compress(Bitmap.CompressFormat.PNG, 85, fOut);
            fOut.flush();
            fOut.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return file;
    }

    private void shareImage(File file) {
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(file.getPath()));
        shareIntent.setType("image/*");
        startActivity(Intent.createChooser(shareIntent, "Share Screenshot"));
    }

使用此选项可以从视图中捕获位图。使用图形缓存时,您的方法将不再有效

  public drawBitmap(View view, int width, int height) {
        Bitmap bm = Bitmap.createBitmap(width,
                height,
                Bitmap.Config.ARGB_8888)

        Canvas canvas = Canvas(bm)
        canvas.drawColor(previewBgColor)

        view.draw(canvas)

        // Store bitmap in dest file,
        File dstFile = File("path/to/file")

        storeBitmap(dstFile, bm)
  }

  public String storeBitmap(File file, Bitmap bmp) {
      FileOutputStream stream;
       try {
          stream = FileOutputStream(file, false)
          bmp.compress(Bitmap.CompressFormat.JPEG,99,it)
       } catch (e: Exception) {
       
       } finally {
          stream.close()
       }

        return file.path
    }

如果文件异常仍然存在,请通知我们。我假设它给出了这个错误,因为位图文件返回“”

我能用这样的结构解决这个问题。非常感谢你对他的帮助

我们首先将这些权限添加到清单文件中

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
现在让我们给出按钮的点击效果

share_friends.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            View rootView = getWindow().getDecorView().findViewById(android.R.id.content);
            Bitmap bitmap = getScreenShot(rootView);
            File file = store(bitmap, "name.png");

            if (file.exists()) {
                shareImage(file);
                System.out.println(file.getPath());
            } else {
                Log.e("file exist", "NO");
            }

        }
    });
按钮中使用的函数

public static Bitmap getScreenShot(View view) {
    View screenView = view.getRootView();
    screenView.setDrawingCacheEnabled(true);
    Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
    screenView.setDrawingCacheEnabled(false);
    return bitmap;
}

public File store(Bitmap bm, String fileName) {
    final String dirPath = Environment.getExternalStorageDirectory().getPath() + "/Screenshots";
    File dir = new File(dirPath);
    if (!dir.exists())
        dir.mkdirs();
    File file = new File(dirPath, fileName);
    try {
        FileOutputStream fOut = new FileOutputStream(file);
        bm.compress(Bitmap.CompressFormat.PNG, 85, fOut);
        fOut.flush();
        fOut.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return file;
}

private void shareImage(File file) {
    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.setType("image/*");
    shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
    shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(Intent.createChooser(shareIntent, "Share Screenshot"));
}

问题是这样解决的。

要将此图像存储在公用图像文件夹中还是临时存储在专用应用程序文件夹中?您好。我想暂时用一下你好。我收到一个“java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'java.lang.String java.io.File.getAbsolutePath()”错误。此外,位图内容再次为空(file:///tmp/Spectacle.wWHVTk/Screenshot_20200906_175756.png)我无法将您的kotlin代码转换为java:(这是我的代码( -- file:///tmp/Spectacle.wWHVTk/Screenshot_20200906_191113.png --)我会将其转换为Java。非常感谢。我就这样尝试了代码。没有问题。但是,当我选择whatsapp时,设备上出现了“不支持的文件类型”错误。这是我的代码(--> file:///tmp/Spectacle.wWHVTk/Screenshot_20200906_202433.png 图片没有上传,你能使用图片托管网站吗?
public static Bitmap getScreenShot(View view) {
    View screenView = view.getRootView();
    screenView.setDrawingCacheEnabled(true);
    Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
    screenView.setDrawingCacheEnabled(false);
    return bitmap;
}

public File store(Bitmap bm, String fileName) {
    final String dirPath = Environment.getExternalStorageDirectory().getPath() + "/Screenshots";
    File dir = new File(dirPath);
    if (!dir.exists())
        dir.mkdirs();
    File file = new File(dirPath, fileName);
    try {
        FileOutputStream fOut = new FileOutputStream(file);
        bm.compress(Bitmap.CompressFormat.PNG, 85, fOut);
        fOut.flush();
        fOut.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return file;
}

private void shareImage(File file) {
    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.setType("image/*");
    shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
    shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(Intent.createChooser(shareIntent, "Share Screenshot"));
}