2016-06-30 2 views
1

Я успешно разместил свой шрифт на apk в папке assets/ моего apk. В настоящее время я пытаюсь получить библиотеку Freetype, чтобы увидеть Arial.ttf внутри папки, но она не может ее найти.Где я могу указать свой загрузчик шрифтов freetype?

APK структура:

apk/ 
    AndroidManifest.xml 
    assets/ 
     Arial.ttf 
    classes.dex 
    lib/ 
    META-INF/ 
    res/ 
    resources.arsc 

Загрузка шрифта:

FT_Face face; 
if (FT_New_Face(ft, "/assets/Arial.ttf", 0, &face)) // TODO: get font locally 
    __android_log_print(ANDROID_LOG_INFO, "SetupGlyphs", "ERROR::FREETYPE: Failed to load font."); 

ответ

1

активы представляют собой файлы на компьютере разработчика. Это не Файлы на устройстве. Это записи в 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++.

+0

Итак, у меня есть данные FileProvider, установленные в манифесте, но у меня возникли проблемы с поиском точных файлов. Я использовал «новый файл (Environment.getExternalStorageDirectory(). GetAbsolutePath(),« Arial.ttf »);' чтобы попытаться найти шрифт, но он не работает, и я тоже не добавляю 'assets /' к первый аргумент. Также мои пути включают в себя '', что может быть проблемой, я не знаю. Где я должен искать файл шрифта? – iHowell

+0

@iHowell: «У меня есть данные FileProvider, настроенные в манифесте» - это больше для моего примера приложения. В основном, я указывал, как я вижу, есть ли у меня файл в 'onCreate()', и если нет, я 'copy()' это из активов. Вам не нужно 'FileProvider', но мое приложение-образец. «Где я должен искать файл шрифта?» - везде, где вы его копируете. В моем случае это файл в 'getFilesDir()', как вы можете видеть в методе 'onCreate()'. – CommonsWare

+0

Когда я говорю, где я должен искать его, я имею в виду, что я не могу найти исходный актив. Один в моей папке с ресурсами. Я получаю сообщение 'java.io.FileNotFoundException: /storage/emulated/0/Arial.ttf: open failed: ошибка EACCES (Permission denied)'. – iHowell

Смежные вопросы