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


127

アセットファイルの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);
}

誰かがアセットフォルダーに存在するファイルの絶対パスに言及する方法を教えてもらえますか

回答:


160

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

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


32
file://android_asset/...ここで、...プロジェクトの内の相対パスでassets/ディレクトリ。
CommonsWare、2011年

4
ここで使用したサンプルプロジェクトでfile://android_asset/はないためもののは、Urigithub.com/commonsguy/cw-advandroid/tree/master/WebView/GeoWeb1
CommonsWare

20
@CommonsWare URIに「/」が含まれていないようです。それはあるはずですfile:///
ThomasW

7
これをとして試しましたがnew File("file:///android_asset/sounds/beep.mid");、結果ファイルが存在しません。何か案は?PSファイルはassets/sounds/フォルダにあります。
叔父レム2014年

3
「file:/// android_asset / ...」がWebViewでのみ機能し、WebViewの外部でURI / URL / Uriを使用してInputStreamを取得できないことは正しいですか?
Lubbo

74

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

file:///android_asset/RELATIVEPATH

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

スキームの3 /に注意してください。Webビューでは、3がなければ私のアセットは読み込まれません。(以前は)CommonsWareからコメントがあったため、2を試しましたが、機能しません。次に、github上のCommonsWareのソースを見て、余分なスラッシュに気づきました。

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

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


動作しなくなりました String fileName = "file:///android_asset/file.csv"; System.out.println(new File(fileName).exists()); // prints false
Elgirhath

@Elgirhath File文字列を受け入れるためのコンストラクタは、URIではなくパスを期待しています。私は数年間Android用にコーディングしていないので、状況が変わった可能性があります。通常のJava Fileクラスを使用して埋め込みアセットフォルダーにアクセスできるかどうかはわかりません。AssetManagerを使用する必要があることを覚えているようです。アセットフォルダー内のファイルは、読み取り専用のバンドルされたAPKでデバイスに配置され、圧縮されます(APKは実際にはzipファイルです)。次のようなものを試してくださいnew File(new URI(filename))
ラス

10

このコードを正常に動作させてみてください

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

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

8

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

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

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

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

1
fileNameディレクトリがある場合に注意してくださいdir/filecache/dir/file存在しないパスでクラッシュします。またif(!it.exist)alsoブロック内をチェックしておくと、ファイルが既にキャッシュにある場合でも毎回ファイルをコピーすることはできません
Yeung

@ ShylendraMadda、@ if(!it.exist)Yeung、エラー未解決の参照を示しています。解決策はありますか?
ビンレビン

そのファイル名でファイルがキャッシュに存在することを確認しますか?@binrebin
Shylendra Madda

@ShylendraMadda、私はファイル名だけを知っています。実際のURIを知らなくても、スクリプトを使用してロードできますか
binrebin

if(!it.exist)は前に置くべきだと思いますit.outputStream()...
Yeung

7

ここに画像の説明を入力してください

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


次のように、好きな場所に配置して、build.gradleファイルにパスを定義できますsourceSets { main { assets.srcDirs = ['src/main/assets'] } }
Marcel Bro

2
hello.htmlのパスを取得する方法は?追加してください
Rohit Singh

6

WebViewで動作しますが、失敗するようURL.openStream()です。したがって、file://プロトコルを区別し、提案されているようにAssetManagerを介してそれらを処理する必要があります。


4

これを試してみてください、それはうまくいきます:

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

Null値例外が発生した場合は、これを試してください(クラスを使用TopBrandData)。

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

機能しない場合は、次の方法を試してください。InputStream in_s1 = TopBrandData.class.getResourceAsStream( "/ assets / TopBrands.xml");
Jaspreet Singh 2014

3
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;
}

1

これを試して :

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

私はそれをしました、そしてそれはうまくいきました



1
働いた。どうもありがとう。Lol、私はget URI内部ファイルを探しています// RES内にRAWフォルダーを作成し、名前ファイルにはa..z0..9文字のみが含まれ、大文字は使用できません!!!
プヌグ

0

ええ、あなたはあなたのコンピュータとアンドロイドが2つの異なるOSであるため、あなたはあなたのアンドロイド電話またはエミュレータからあなたのドライブフォルダにアクセスすることができません。私はそれが良いリソース管理方法を持っているのでアンドロイドの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);
 }

-7

このコードを試してみてください

   uri = Uri.fromFile(new File("//assets/testdemo.txt"));
   String testfilepath = uri.getPath();
    File f = new File(testfilepath);
    if (f.exists() == true) {
    Toast.makeText(getApplicationContext(),"valid :" + testfilepath, 2000).show();
    } else {
   Toast.makeText(getApplicationContext(),"invalid :" + testfilepath, 2000).show();
 }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.