web-dev-qa-db-ja.com

アセットファイルからURIを取得する方法は?

アセットファイルのURIパスを取得しようとしています。

uri = Uri.fromFile(new File("//assets/mydemo.txt"));

ファイルが存在するかどうかを確認すると、ファイルが存在しないことがわかります

File f = new File(filepath);
if (f.exists() == true) {
    Log.e(TAG, "Valid :" + filepath);
} else {
    Log.e(TAG, "InValid :" + filepath);
}

アセットフォルダーに存在するファイルの絶対パスに言及する方法を教えてください

105
Titus

「アセットフォルダーに存在するファイルの絶対パス」はありません。プロジェクトのassets/フォルダーのコンテンツはAPKファイルにパッケージ化されています。 AssetManager オブジェクトを使用して、アセットのInputStreamを取得します。

WebViewの場合、URLを使用するのとほぼ同じ方法でfileUriスキームを使用できます。アセットの構文はfile:///Android_asset/...(注:3つのスラッシュ)です。ここで、省略記号はassets/フォルダー内からのファイルのパスです。

139
CommonsWare

正しいURLは次のとおりです。

file:///Android_asset/RELATIVEPATH

ここで、RELATIVEPATHは、アセットフォルダーを基準としたリソースへのパスです。

スキームの3 /。 Webビューは、3なしではアセットをロードしません。CommonsWareが(以前)コメントしたように2を試しましたが、機能しませんでした。それからgithubでCommonsWareのソースを見て、余分なスラッシュに気付きました。

ただし、このテストは1.6 Androidエミュレーターでのみ行われましたが、実際のデバイスまたはそれ以降のバージョンでは異なると思います。

編集:CommonsWareは、この小さな変更を反映するために回答を更新しました。だから私はこれを編集したので、彼の現在の答えでそれが意味をなすようになった。

68
Russ

enter image description here

アセットフォルダーが正しい位置にあることを確認してください。

8
Chuanhang.gu

正常に動作するこのコードを試してください

 Uri imageUri = Uri.fromFile(new File("//Android_asset/luc.jpeg"));

    /* 2) Create a new Intent */
    Intent imageEditorIntent = new AdobeImageIntent.Builder(this)
            .setData(imageUri)
            .build();
7
Raaz Thakur

WebViewで動作しますが、URL.openStream()で失敗するようです。そのため、file://プロトコルを区別し、推奨されるようにAssetManagerで処理する必要があります。

6
Gaylord Zach
InputStream is = getResources().getAssets().open("terms.txt");
    String textfile = convertStreamToString(is);

public static String convertStreamToString(InputStream is)
            throws IOException {
            Writer writer = new StringWriter();

            char[] buffer = new char[2048];
            try {
                Reader reader = new BufferedReader(new InputStreamReader(is,
                        "UTF-8"));
                int n;
                while ((n = reader.read(buffer)) != -1) {
                    writer.write(buffer, 0, n);
                }
            } finally {
                is.close();
            }
            String text = writer.toString();
            return text;
3

これを試してください:それは動作します

InputStream in_s = getClass().getClassLoader().getResourceAsStream("TopBrands.xml");

null値の例外がある場合は、これを試してください。

InputStream in_s1 =   TopBrandData.class.getResourceAsStream("/assets/TopBrands.xml");

TopBranDataはクラスです

3
Jaspreet Singh

これを試して :

Uri uri = Uri.parse("Android.resource://"+getPackageName()+"/"+R.raw.cat); 

私はそれをやったし、それは働いた

1
Nyle

最後に、アセットに存在するファイルのパスをKotlinの this answerから取得する方法を見つけました。ここでは、アセットファイルをキャッシュにコピーし、そのキャッシュファイルからファイルパスを取得しています。

@Throws(IOException::class)
fun getFileFromAssets(context: Context, fileName: String): File = File(context.cacheDir, fileName)
    .also {
        it.outputStream().use { cache -> context.assets.open(fileName).use { it.copyTo(cache) } }
    }

次のようなファイルへのパスを取得します。

val filePath =  getFileFromAssets(context, "fileName.extension").absolutePath
0
Shylendra Madda

あなたのコンピューターとAndroidは2つの異なるOSであるため、あなたはAndroid電話またはエミュレーターからドライブフォルダーにアクセスできません。Androidのresフォルダーに行きます_優れたリソース管理方法があるため。アセットフォルダーにファイルを配置する非常に正当な理由がない限り。代わりにこれを行うことができます

try {
      Resources res = getResources();
      InputStream in_s = res.openRawResource(R.raw.yourfile);

      byte[] b = new byte[in_s.available()];
      in_s.read(b);
      String str = new String(b);
    } catch (Exception e) {
      Log.e(LOG_TAG, "File Reading Error", e);
 }
0
willnotquit