相关疑难解决方法(0)

android.os.FileUriExposedException:file:///storage/emulated/0/test.txt通过Intent.getData()暴露在app之外

当我尝试打开文件时,应用程序崩溃了.它可以在Android Nougat下运行,但在Android Nougat上它会崩溃.当我尝试从SD卡打开文件而不是从系统分区打开文件时,它只会崩溃.一些许可问题?

示例代码:

File file = new File("/storage/emulated/0/test.txt");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "text/*");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent); // Crashes on this line
Run Code Online (Sandbox Code Playgroud)

日志:

android.os.FileUriExposedException:file:///storage/emulated/0/test.txt通过Intent.getData()暴露在app之外

编辑:

在定位Android Nougat时,file://不再允许使用URI.我们应该使用content://URI代替.但是,我的应用程序需要打开根目录中的文件.有任何想法吗?

android android-file android-7.0-nougat

682
推荐指数
15
解决办法
38万
查看次数

如何以编程方式截取屏幕截图?

如何通过任何程序而不是代码来截取手机屏幕的选定区域?

android screenshot

483
推荐指数
19
解决办法
31万
查看次数

将位图保存到位置

我正在开发一个功能,从Web服务器下载图像,将其显示在屏幕上,如果用户希望保留图像,请将其保存在某个文件夹中的SD卡上.是否有一种简单的方法来获取位图并将其保存到我选择的文件夹中的SD卡?

我的问题是我可以下载图像,将其作为位图显示在屏幕上.我能够找到将图像保存到特定文件夹的唯一方法是使用FileOutputStream,但这需要一个字节数组.我不确定如何从Bitmap转换(如果这是正确的方法)到字节数组,所以我可以使用FileOutputStream来写入数据.

我有另一个选择是使用MediaStore:

MediaStore.Images.Media.insertImage(getContentResolver(), bm,
    barcodeNumber + ".jpg Card Image", barcodeNumber + ".jpg Card Image");
Run Code Online (Sandbox Code Playgroud)

哪个可以保存到SD卡,但不允许您自定义文件夹.

android bitmap save

457
推荐指数
12
解决办法
47万
查看次数

MediaStore.Images.Media.insertImage 已弃用

我曾经使用MediaStore.Images.Media.insertImageinsertImage方法保存图像现在已弃用。该文件说:

此方法在 API 级别 29 中已弃用。插入图像应使用MediaColumns#IS_PENDING执行,它提供了对生命周期的更丰富的控制。

我真的不明白,因为MediaColumns.IS_PENDING它只是一个标志,我应该如何使用它?

我应该使用ContentValues吗?

android mediastore

24
推荐指数
3
解决办法
1万
查看次数

API级别29中不推荐使用Environment.getExternalStorageDirectory()

在android Java上工作,最近将SDK更新到API级别29,现在显示警告,指出

Environment.getExternalStorageDirectory() 在API级别29中已弃用

我的代码是

private void saveImage() {

if (requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

    final String folderPath = Environment.getExternalStorageDirectory() + "/PhotoEditors";
    File folder = new File(folderPath);
    if (!folder.exists()) {
        File wallpaperDirectory = new File(folderPath);
        wallpaperDirectory.mkdirs();
    }


    showLoading("Saving...");
    final String filepath=folderPath
                + File.separator + ""
                + System.currentTimeMillis() + ".png";
    File file = new File(filepath);

    try {
        file.createNewFile();
        SaveSettings saveSettings = new SaveSettings.Builder()
                .setClearViewsEnabled(true)
                .setTransparencyEnabled(true)
                .build();
        if(isStoragePermissionGranted() ) {
            mPhotoEditor.saveAsFile(file.getAbsolutePath(), saveSettings, new PhotoEditor.OnSaveListener() {
            @Override
            public void onSuccess(@NonNull String imagePath) {
                hideLoading();
                showSnackbar("Image Saved …
Run Code Online (Sandbox Code Playgroud)

android deprecated android-api-levels

14
推荐指数
7
解决办法
6338
查看次数

如何使用MediaStore在Android Q中保存图像?

这是新的Android Q 范围存储的链接。

根据此Android开发者最佳实践博客storing shared media files(这是我的情况)应使用MediaStore API完成。

深入研究文档,我找不到相关功能。

这是我在科特林的审判:

val bitmap = getImageBitmap() // I have a bitmap from a function or callback or whatever
val name = "example.png" // I have a name

val picturesDirectory = getExternalFilesDir(Environment.DIRECTORY_PICTURES)!!

// Make sure the directory "Android/data/com.mypackage.etc/files/Pictures" exists
if (!picturesDirectory.exists()) {
    picturesDirectory.mkdirs()
}

try {
    val out = FileOutputStream(File(picturesDirectory, name))
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)

    out.flush()
    out.close()

} catch(e: Exception) {
    // handle the error
}
Run Code Online (Sandbox Code Playgroud)

结果是,Android/data/com.mypackage.etc/files/Pictures/example.png …

java android image mediastore kotlin

13
推荐指数
3
解决办法
2680
查看次数

android截屏并共享

我试图在我的应用程序中添加一个共享按钮,该按钮获取屏幕截图,然后通过Facebook等进行共享。我已经在互联网上进行了搜索。我也搜索过堆栈溢出;有很多与此问题相关的主题,但我还不能弄清楚。使我感到困惑的是..在每个示例中,图像的文件路径都是硬编码的。我确实喜欢这样,但是它没有用处且动态。我想做的是获取那一刻的屏幕快照,然后共享它,但是当我自己给出文件路径时,它只是从文件夹中拍摄该图片并共享

public void clickButton(View v) {
    Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);

    //set the type  
    shareIntent.setType("image/png");

    //add a subject  
    shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
            "CAR EXAMPLE");

    //build the body of the message to be shared  
    String shareMessage = "An app...";

    //add the message  
    shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareMessage);

    //add the img
    shareIntent.putExtra(Intent.EXTRA_STREAM,
            Uri.parse("/storage/sdcard0/Tutorial_ScreenShot/screenshot0.jpg"));

    //start the chooser for sharing  
    startActivity(Intent.createChooser(shareIntent, "Share"));
}
Run Code Online (Sandbox Code Playgroud)

如您所见,在添加图像部分中,我自己指定了文件路径。所以如何赋予它更多动态的行为..我的意思是当我单击按钮时,我的应用程序的屏幕必须保存在一个文件夹中,然后我可以共享该文件而无需对其文件路径进行硬编码。

编辑:尝试以下解决方案后;

非常感谢。我已经在按钮的onClick下调用了shareIt(),应用程序停止了……这是日志。

12-28 15:53:01.660: E/AndroidRuntime(14120): FATAL EXCEPTION: main
12-28 15:53:01.660: E/AndroidRuntime(14120): Process: com.hede.namesurfer, PID: 14120   
12-28 15:53:01.660: E/AndroidRuntime(14120): java.lang.NullPointerException
12-28 15:53:01.660: E/AndroidRuntime(14120):    at      
com.hede.namesurfer.MainActivity.share(MainActivity.java:161)
12-28 15:53:01.660: …
Run Code Online (Sandbox Code Playgroud)

android screenshot sharing

5
推荐指数
1
解决办法
9291
查看次数

Android - 以编程方式捕获ScreenShot而不使用标题栏

我正在开发一个应用程序,我想拍摄当前屏幕的屏幕截图,但没有标题栏.我知道捕获ScreenShot的代码,但无法自定义它.

码:

munchscreen.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                View v1 = L1.getRootView();
                v1.setDrawingCacheEnabled(true);
                Bitmap bm = v1.getDrawingCache();
                BitmapDrawable bitmapDrawable = new BitmapDrawable(bm);
                image = (ImageView) findViewById(R.id.screenshots);
                image.setBackgroundDrawable(bitmapDrawable);
            }
        });
Run Code Online (Sandbox Code Playgroud)

当我点击它Clip然后它应该捕获下面显示的屏幕的屏幕截图,但不应该包括我圈出的部分..

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#D8D5AA"
>


  <LinearLayout 
    android:id="@+id/clip_from_web_linearlayout1"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@drawable/header"
    android:orientation="horizontal"             
    >
         <TextView 
        android:id="@+id/clip_from_web_textview_back"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="Back"
        android:layout_gravity="center"
        android:layout_marginLeft="5dp"
        android:textColor="#FFFFFF"
        android:textSize="18sp"
        /> 

    <TextView 
        android:id="@+id/clip_from_web_textview_header_title"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="Clip From Web"
        android:layout_gravity="center"
        android:layout_marginLeft="60dp"
        android:textColor="#FFFFFF"
        android:textSize="18sp"
        /> 

      <TextView 
        android:id="@+id/clip_from_web_textview_clip"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="Clip"
        android:layout_gravity="center" …
Run Code Online (Sandbox Code Playgroud)

android

2
推荐指数
1
解决办法
7481
查看次数