当前位置: 首页 > 知识库问答 >
问题:

Android:使用从URI路径检索的文件返回FileNotFound异常?[副本]

皮弘博
2023-03-14
apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.example.changingimageviewwidth"
        minSdkVersion 26
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

    implementation "org.apache.sanselan:sanselan:0.97-incubator"
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:orientation="vertical">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button"
        android:onClick="analyzePhoto"/>

</LinearLayout>

mainactivity.java:

package com.example.changingimageviewwidth;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;

import org.apache.sanselan.ImageInfo;
import org.apache.sanselan.Sanselan;

import java.io.File;

public class MainActivity extends AppCompatActivity {
    // Request code used when reading in a file
    private Integer READ_IN_FILE = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void analyzePhoto(View v) {
        // Specify that only photos are allowed as inputs (.jpg, .png).
        Intent photoInputSpecs = new Intent(Intent.ACTION_GET_CONTENT);
        photoInputSpecs.setType("image/*");

        Intent photoInputHandler = Intent.createChooser(photoInputSpecs, "Choose a file");
        startActivityForResult(photoInputHandler, 0);
    }

    // Processes the results of Activities.
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        try {
            // Processes the photos that the user selected
            if (requestCode == READ_IN_FILE) {
                System.out.println("Let us process the photos that the user selected.");
                // Retrieve the photo's location
                Uri photoUri = data.getData();
                String photoPath = photoUri.getPath();
                File photoFile = new File(photoPath);

                ImageInfo image1Info = Sanselan.getImageInfo(photoFile);

                int image1HorizontalDPI = image1Info.getPhysicalWidthDpi();
                int image1VerticalDPI = image1Info.getPhysicalHeightDpi();

                System.out.println("[image1HorizontalDPI] = " + image1HorizontalDPI);
                System.out.println("[image1VerticalDPI] = " + image1VerticalDPI);
            }
        }
        catch (Exception ex) {
            System.out.println("onActivityResult error: " + ex.toString());
        }
    }
}

共有1个答案

吕霖
2023-03-14

您可以使用下面的类从URI获取实际路径

https://raw.githubusercontent.com/abcoderz/externalfiles/main/realpathfromuri.java

使用上面的链接下载RealPathFromURI,并像下面这样更改代码

 类似资料:
  • 我正在尝试获取内容URI的文件路径。URL如下所示:content://com.android.providers.downloads.documents/document/31 游标对象不是null,但cursor.getString(column_index)返回null。 列索引始终为0。 编辑:内容URI是从文件管理器返回的,因此它应该表示实际的文件。

  • 我试图通过我的图像与意图在Xamarin Android与C#。在第一个活动中,我使用将图像路径解码为位图文件。我还用然后,在单击按钮时传递URI路径,该按钮将使用将图片引用到下一个活动。在下一个活动中,我想从第一个活动中获得传递路径值。 但是,我得到一个带有空异常错误的错误。路径返回null,程序崩溃。请帮帮我!几个小时后我觉得卡住了。有人帮忙吗?以下是我的完整代码: 第一个活动-我的onAct

  • 我想从图库中选择一个图像,然后使用它将图像加载到ImageView项中。 但是图像没有以正确的方式旋转,所以我应该使用ExifInterface类,并且exif构造函数希望文件的路径是字符串,而不是URI。 为了将URI转换为字符串,我编写了以下方法: 问题从这里开始... 结果变量总是返回null。我尝试了stackoverflow中的许多解决方案,如下所示: 我试图用null值查询投影。仍然返

  • 我正在尝试使用隐式意图操作_SEND将其他应用程序中的图像共享到我的应用程序中。 当从chrome浏览器共享搜索图像时,应用程序接收到一个内容URI,如下所示: 如何从这种类型的内容URI获取文件路径?所有其他应用,比如Facebook、谷歌都在这么做。我使用FileChooser获取其他类型内容URI的文件路径(例如,从Gallery)。 试着到处寻找,但没有太多帮助。有人能建议如何使用这些内容

  • 目前,我正在java中建立一个Firebase云火力恢复,使用IntelliJ作为SDK。在Firebase留档中,据说需要服务帐户密钥,这是一个json文件。我使用FileInputStream方法获得这个json文件,当我得到执行程序的文件时,我没有任何问题,但是当我将其导出为JAR库时,使用该JAR的项目没有找到服务帐户密钥,然后它无法与我的Firebase连接。 现在,我可以连接到Fire

  • 我有一个应用程序,可以用相机拍摄视频。我可以获取视频的文件路径,但我需要它作为Uri。 我得到的文件路径: 我需要的是这样的: 这是我的密码。 我需要一个Uri从字符串变量。