Как получить URI из файла актива? - PullRequest
106 голосов
/ 27 января 2011

Я пытался получить путь 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);
}

Может кто-нибудь сказать мне, как я могу указать абсолютный путь к файлу, существующему в папке ресурсов

Ответы [ 11 ]

140 голосов
/ 27 января 2011

Не существует «абсолютного пути к файлу, существующему в папке ресурсов». Содержимое папки assets/ вашего проекта упаковано в файл APK. Используйте объект AssetManager, чтобы получить InputStream для актива.

Для WebView вы можете использовать схему file Uri почти так же, как и URL. Синтаксис для ресурсов: file:///android_asset/... (примечание: три слеша), где многоточие - это путь к файлу из папки assets/.

68 голосов
/ 06 сентября 2011

Правильный URL-адрес:

file:///android_asset/RELATIVEPATH

, где RELATIVEPATH - путь к вашему ресурсу относительно папки ресурсов.

Примечание 3 / всхема.Просмотр через Интернет не загрузил бы ни один из моих активов без 3. Я попробовал 2, как (ранее) прокомментировал CommonsWare, и он не будет работать.Затем я посмотрел на исходный код CommonsWare на github и заметил дополнительную косую черту.

Это тестирование проводилось только на эмуляторе Android 1.6, но я сомневаюсь, что оно отличается на реальном устройстве или более поздней версии.

EDIT: CommonsWare обновил свой ответ, чтобы отразить это крошечное изменение.Так что я отредактировал это, так что это все еще имеет смысл с его текущим ответом.

8 голосов
/ 31 мая 2016

enter image description here

Убедитесь, что папка с активами установлена ​​в правильное положение.

7 голосов
/ 04 января 2017

Пожалуйста, попробуйте этот код, работающий нормально

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

    /* 2) Create a new Intent */
    Intent imageEditorIntent = new AdobeImageIntent.Builder(this)
            .setData(imageUri)
            .build();
6 голосов
/ 03 сентября 2011

Работает для WebView, но, похоже, не работает на URL.openStream(). Поэтому вам нужно различать протоколы file: // и обрабатывать их с помощью AssetManager, как было предложено.

3 голосов
/ 02 июля 2014

Попробуйте это: это работает

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

если у вас исключение NULL, попробуйте следующее:

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

TopBranData - это класс

3 голосов
/ 03 марта 2012
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 голос
/ 21 февраля 2014

попробуйте это:

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

Я сделал это, и это сработало

0 голосов
/ 05 июня 2019

Наконец, я нашел способ получить путь к файлу, который присутствует в ресурсах, из этого ответа в Kotlin.Здесь мы копируем файл ресурсов в кэш и получаем путь к файлу из этого файла кэша.

@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 голосов
/ 20 августа 2015

работал для меня Попробуйте этот код

   uri = Uri.fromFile(new File("//assets/testdemo.txt"));
    File f = new File(testfilepath);
    if (f.exists() == true) {
    Toast.makeText(getApplicationContext(),"valid :" + testfilepath, 2000).show();
    } else {
   Toast.makeText(getApplicationContext(),"invalid :" + testfilepath, 2000).show();
 }
...