активы представляют собой файлы на компьютере разработчика. Это не Файлы на устройстве. Это записи в ZIP-архиве, который является APK.
В коде Java (скорее всего) вам нужно будет скопировать ресурс (от AssetManager
) в локальный файл в файловой системе, а затем использовать собственный код для локальной копии файловой системы.
Например, эта деятельность, копирует PDF от актива к внутренней памяти, чтобы иметь возможность просматривать его с помощью FileProvider
и просмотра третьей стороной PDF:
/***
Copyright (c) 2013 CommonsWare, LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
by applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License.
From _The Busy Coder's Guide to Android Development_
https://commonsware.com/Android
*/
package com.commonsware.android.cp.v4file;
import android.app.Activity;
import android.content.Intent;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.support.v4.content.FileProvider;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class FilesCPDemo extends Activity {
private static final String AUTHORITY="com.commonsware.android.cp.v4file";
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
File f=new File(getFilesDir(), "test.pdf");
if (!f.exists()) {
AssetManager assets=getResources().getAssets();
try {
copy(assets.open("test.pdf"), f);
}
catch (IOException e) {
Log.e("FileProvider", "Exception copying from assets", e);
}
}
Intent i=
new Intent(Intent.ACTION_VIEW,
FileProvider.getUriForFile(this, AUTHORITY, f));
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(i);
finish();
}
static private void copy(InputStream in, File dst) throws IOException {
FileOutputStream out=new FileOutputStream(dst);
byte[] buf=new byte[1024];
int len;
while ((len=in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
}
В вашем случае, вы могли бы сделать эта работа перед запуском вашего кода JNI, требующего шрифта. И поскольку путь может варьироваться от устройства к устройству или пользователю к пользователю, перейдите по пути к шрифту в код JNI, вместо того, чтобы пытаться жестко закодировать его в C/C++.
Итак, у меня есть данные FileProvider, установленные в манифесте, но у меня возникли проблемы с поиском точных файлов. Я использовал «новый файл (Environment.getExternalStorageDirectory(). GetAbsolutePath(),« Arial.ttf »);' чтобы попытаться найти шрифт, но он не работает, и я тоже не добавляю 'assets /' к первый аргумент. Также мои пути включают в себя ' ', что может быть проблемой, я не знаю. Где я должен искать файл шрифта? –
iHowell
@iHowell: «У меня есть данные FileProvider, настроенные в манифесте» - это больше для моего примера приложения. В основном, я указывал, как я вижу, есть ли у меня файл в 'onCreate()', и если нет, я 'copy()' это из активов. Вам не нужно 'FileProvider', но мое приложение-образец. «Где я должен искать файл шрифта?» - везде, где вы его копируете. В моем случае это файл в 'getFilesDir()', как вы можете видеть в методе 'onCreate()'. – CommonsWare
Когда я говорю, где я должен искать его, я имею в виду, что я не могу найти исходный актив. Один в моей папке с ресурсами. Я получаю сообщение 'java.io.FileNotFoundException: /storage/emulated/0/Arial.ttf: open failed: ошибка EACCES (Permission denied)'. – iHowell