Android tutorial — android assets

8 ответов

Я нашел ответ здесь:
/wmdoc_6.5/PhoneGap?xpage=print#HTheconnectiontotheserverwasunsucessful28file3A2F2F2Fandroidasset2Fwww2Findexhtml29

Это означает, что в вашем index.html вы используете ресурс, который требует доступа в Интернет. Просмотрите ваш index.html и найдите любой файл CSS, javascript или Cordova, связанный напрямую из Интернета. Если это так, вы должны загрузить соответствующий файл и сделать его локальным.

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

Я скачал файл jquery.mobile-1.3.0.js и поместил его локально в мою папку www. Это решило мою проблему.

вам нужно только переименовать ваш «index.html», например, в «main.html», и создать новый (фиктивный) «index.html», который нужно перенаправить только в «main.html»

Содержимое нового index.html:

Я нашел ответ.

Включите phonegap.js в тег . Это требуется телефонной пробой во время сборки.

Вам не нужно скачивать phonegap.js. Все, что вам нужно, это включить код, как показано на рисунке. Во время сборки PhoneGap будет искать его и автоматически включать. Если нет, то при запуске вашего нативного приложения оно будет искать phonegap.js на сервере phonegap, и это займет слишком много времени. В конце концов загрузка вашего приложения прекратится с сообщением об ошибке, которое вы видите.

Ничего себе! Я могу в это поверить. Я столкнулся с этой проблемой, я был обескуражен и почти отказался от использования разрыва телефона. Тем не менее, я прочитал его на сайте PhoneGap о phonegap.js под подзаголовком ниже

«Убедитесь, что вы все еще можете получить доступ к PhoneGap API»

«После того как вы удалили phonegap.js, вам нужно убедиться, что ваше приложение все еще имеет доступ к PhoneGap API.

Для этого просто убедитесь, что в вашем index.html сделана следующая ссылка «

Это похоже на магию. Это работает.

Приветствует всех.

Я следую за Быстрый старт, Гие «, и у меня та же проблема.
Но я решил это.
Моя проблема заключалась в несоответствии между загруженной телефонной пробкой и последовавшим за ней парнем.

Вы должны быть уверены, что это детали:
— В intex.html вы указываете правильную версию js-скрипта (например: cordova-2.7.0.js)
— Он должен соответствовать загруженной версии PhoneGab.
Версия PhoneGab и сценарий JS должны совпадать.

Надеюсь, это поможет вам.

Пустой тег доступа разрешает доступ ко всем внешним ресурсам.

В противном случае вы можете указать конкретные домены:

Надеюсь, это поможет.

Убедитесь, что вы включили сценарий phonegap.js или cordova.js на своей странице.
Это будет работать только на вашем мобильном устройстве.

Вы должны использовать:

в качестве URL

Load with AndroidX

When loading drawables you need to use methods from AndroidX which provide the backported vector support. The entry point for this is to always load drawables with . While there are a to load drawables (because reasons), you must use if you want to use compat vectors. If you fail to do this, then you won’t hook into the AndroidX code path and your app might crash when trying to use any features not supported by the platform you’re running on.

If you want to set drawables declaratively (i.e. in your layouts) then offers a number of attributes that you should use instead of the standard platform ones:

, :

  • Don’t:
  • Do:

, :

  • Don’t:
  • Do:

():

  • Don’t: etc.
  • Do: etc.

As these attributes are part of the library, be sure to use the namespace. Internally these views use themselves to enable loading vectors.

In Practice

These requirements effect the way you might create a layout or access resources. Here are some practical considerations.

Используем собственные шрифты

Напишем практический пример создания приложения, в котором будут использоваться собственные шрифты, не входящие в стандартную библиотеку шрифтов Android. Для этого мы упакуем нужные шрифты вместе с приложением. Поместим в каталог assets/fonts файлы шрифтов (можно скачать бесплатные шрифты с сайтов 1001 Free Fonts или Urban Fonts ).

В файл разметки добавим пару текстовых полей с заготовленным текстом для вывода этого текста с нашим шрифтом.

В классе активности загрузим объект EditText из ресурсов, а затем создадим объект Typeface, используя вызов статического метода Typeface.createFromAsset(). Метод createFromAsset() принимает два параметра:

  • объект AssetManager, который можно получить вызовом метода getAssets()
  • путь к файлу актива.

Например, загрузить шрифт для текстового поля EditText можно следующим способом:

Запустив проект, мы увидим в текстовых полях надписи Happy New Year! и Meow!, выводимые нашими собственными шрифтами.

Пример для фрагмента.

Известные особенности

  • Наиболее стабильные результаты можно получить на root-ованных девайсах
  • Не используйте Samsung-и, на них есть множество защитных наворотов, которые мешают отладке
  • Во множестве мест ваш колстэк будет уходить в функции вида ‘kernel.kptr + адрес’. Это вызовы внутри Android Kernel, которые защищены из-за политики безопасности. На рутованном устройстве защиту можно отключить:
    • Запустите `adb shell`
    • Запустите `su` чтобы получить права root-пользователя
    • Выполните ‘sysctl -w kernel.kptr_restrict=0’ — это снимет защите с kernel-а
    • После окончания отладки, выполните ‘sysctl -w kernel.kptr_restrict=1’. Некоторые устройства иначе при перезагрузке не смогут загрузить OS. Во многих случаях лечится только перепрошивкой чистого ядра.
  • Если Android Studio часто падает, можно попробовать увеличить heap Java VM:
    • 2Gb — для проектов среднего размера (‘-Xmx2g’)
    • 4Gb — для больших проектов (‘-Xmx4g’)
  • На нерутованных устройствах иногда улучшает ситуацию переключение ядра в ‘permissive mode’

Меняем номер версии библиотек в одном месте

Очень часто в проекте используются взаимосвязанные библиотеки с одинаковыми номерами.

Можно быстро поменять у всех номера через переменную. Для этого используется секция ext, в которой указывается переменная и номер версии. Затем в секции dependencies номер версии заменяется на имя переменной

Обратите внимание, что одинарные кавычки заменяются на двойные, а символ $ указывает на строковый тип. Расширенная версия с разными переменными в другом виде

Расширенная версия с разными переменными в другом виде.

Если в проекте используются несколько модулей с одинаковыми зависимостями, то эти записи можно перенести в корневой build.gradle, чтобы не менять номера версий в каждом модуле.

Добавление assets

Теперь нужно добавить в проект 3D-модели, которые будут отображаться на вашем экране. Вы можете создавать эти модели самостоятельно, если вы знакомы с процессом их создания. Или же вы можете зайти на Poly.

Там вы найдете огромный репозиторий 3D-ресурсов на выбор. Кроме того, они бесплатны для скачивания.

В Android Studio откройте папку своего приложения в панели слева. Вам нужна папка sampledata. Эта папка будет содержать все ваши 3D-модели. Внутри этой папки создайте папку с названием своей модели.

В архиве, который вы скачаете с Poly, вы, скорее всего, найдёте 3 файла:

  1. -файл
  2. -файл
  3. -файл

Наиболее важным из этих трёх файлов является файл . Это и есть ваша модель. Поместите все 3 файла в sampledata -> «папка вашей модели».

Теперь щёлкните правой кнопкой мыши на файле . Первым вариантом будет Import Sceneform Asset. Нажмите на него, не меняйте настройки по умолчанию, просто нажмите Finish в следующем окне. После этого синхронизируйте проект с Gradle-файлами.

Импорт 3D-ресурса, который будет использован в вашем проекте, завершён. Далее давайте используем 3D-модель в нашем коде и включим его в сцену.

Store and use files in Assets

October 2, 2011
Pete Houston

There are times when you probably want to your application distribution with raw resources, instead of pre-defined resources, the ‘res‘ folder, you gonna have to make use of ‘Asset‘.

‘Assets’ folder will be distributed along with the APK, which contains all the raw files you need for application, such as: text files (.txt), non-Android XML files (.xml), Audio files (.wav, .mp3, .mid)…; those cannot be put into ‘res‘ folder as usual.

Thing needed to be looked up here: AssetManager from Android Developers’ References

This class does the job that we need.

First, create a project as usual, then put files into ‘asset‘ like below:

Files in ‘Assets’

Now, create a simple layout containing a TextView for displaying the content of ‘text.txt‘ and an ImageView for displaying the image ‘avatar.jpg’, which are put in Asset.

The implementation quite easy using AssetManager as mentioned above.

package pete.android.study;

import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

public class Main extends Activity {

	ImageView mImage;
	TextView mText;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mImage = (ImageView)findViewById(R.id.image);
        mText = (TextView)findViewById(R.id.text);
        loadDataFromAsset();
    }

    public void loadDataFromAsset() {
    	// load text
    	try {
    		// get input stream for text
	    	InputStream is = getAssets().open("text.txt");
	    	// check size
	    	int size = is.available();
	    	// create buffer for IO
	    	byte[] buffer = new byte;
	    	// get data to buffer
	    	is.read(buffer);
	    	// close stream
	    	is.close();
	    	// set result to TextView
	    	mText.setText(new String(buffer));
    	}
    	catch (IOException ex) {
    		return;
    	}

    	// load image
    	try {
	    	// get input stream
	    	InputStream ims = getAssets().open("avatar.jpg");
	    	// load image as Drawable
	    	Drawable d = Drawable.createFromStream(ims, null);
	    	// set image to ImageView
	    	mImage.setImageDrawable(d);
    	}
    	catch(IOException ex) {
    		return;
    	}

    }
}

That’s a quick sample code giving this result.

Read data from Asset

The distributed APK file contains the folder ‘assets‘, you might wanna check by opening it.

Quite easy, isn’t it?

@p/s: you can load image from Asset into Bitmap by using BitmapFactory.decodeStream(), instead of using Drawable.

Have fun w/ Android Coding

Cheers,

Pete Houston

Categories: Tutorials
asset, bitmap, image, manager, raw, resource, text

Nested drawables

Some drawable types are nestable e.g. s, s or s contain other child drawables. The AndroidX support works by explicitly knowing how to inflate elements (also s and s, but we’ll focus on static vectors today). When you call , it peeks at the resource with the given and if it is a vector (i.e. the root element is ), it manually inflates it for you. Otherwise, it hands it off to the platform to inflate — when doing so, there’s no way for AndroidX to re-insert itself back into the process. That means that if you have an containing a vector and ask to load it for you, it will see the tag, shrug, and hand it to the platform to load. It therefore will not get a chance to load the nested so this will either fail (on API <21) or just fall back to the platform support.

To work around this, you can create drawables in code; i.e. use to inflate the vector and then create the drawable manually.

One exception is a recent addition to AndroidX () back-ported s. This is a version of with animated transitions between states (in the form of ). But there is nothing requiring you to declare transitions. So if you just need a which can inflate child vectors using AndroidX, then you could use this:

Credit for this genius hack:

R8 включён по умолчанию

  • R8 объединяет desugaring, сжатие, обфускацию, оптимизацию и dexing в один шаг, что даёт заметное улучшение производительности. R8 был введён в Android Gradle plugin 3.3.0 и теперь включён по умолчанию и для приложения и для Android library проектов, использующих плагин версии 3.4.0 или выше

  • изображение ниже показывает в общих чертах процесс компиляции до R8

  • теперь, с R8, desugaring, сжатие, обфускация, оптимизация и dexing (D8) выполняются за один шаг, как показано ниже

  • R8 разработан для работы с вашими существующими ProGuard правилами, так что вам нет необходимости предпринимать каких-либо действий для получения преимуществ от R8. Между тем, поскольку эта технология отличается от ProGuard, который разработан специально для Android проектов, сжатие и оптимизация могут состоять в удалении кода который ProGuard не удаляет. Поэтому, в этой маловероятной ситуации, вам может потребоваться добавить дополнительные правила чтобы сохранить этот код в итоговой сборке

  • при возникновении проблем в использовании R8, прочтите R8 compatibility FAQ чтобы проверить нет ли готового решения. Если решение ещё не документировано, пожалуйства сообщите о баге. Вы можете отключить R8 через добавление одной из следующих инструкций в файл gradle.properties вашего проекта:

    <i>#отключение R8 только для Android Library модулей</i>
    android.enableR8.libraries = false</p>
    <p><i>#отключение R8 для всех модулей</i>
    android.enableR8 = false
    
  • ПРИМЕЧАНИЕ: для указанного типа сборки, если вы зададите false для useProguard в файле build.gradle вашего app-модуля, Android Gradle plugin будет использовать R8 для сжатия кода приложения для этого типа сборки, вне зависимости отключен ли R8 в файле gradle.properties вашего проекта

Unity специфика

  • Главный поток Unity называется UnityMain, но вы можете увидеть множество UnityMain при профилировании. Это пользовательские потоки, которые вы создаете внутри C# кода. По умолчанию они получают такое же имя. Главный поток Unity обычно легко отличить, так как он будет самый нагруженный.
  • Графический поток называется UnityGfxWorkerW
  • Потоки Unity Job системы называются Worker Thread
  • К сожалению некоторые wait-функции, которые применяет Unity (futex-ы), Android Studio показывает и считает не как wait-time, а как активность.
  • Когда вы будете смотреть call graph в Top Down view, вам придётся пройти через множество уровней Java-вызовом, к сожалению отфильтровать в Android Studio это никак нельзя.

Как организовать Figma-файл для автоматизированного экспорта ресурсов

Общие

Пример.ic24ShareIosic24ShareAndroid

  • Иконки и иллюстрации должны быть компонентами.
  • Цветовые стили и компоненты должны быть опубликованы в Team Library.
  • Экспортируются только те иконки и иллюстрации, которые добавлены во фреймы Icons и Illustrations.

ПримерыFigma-файл с UI-Kit (светлая тема)Figma-файл с UI-Kit (темная тема)Названия ресурсовcamelCase snake_case

Название цвета iOS Android
button/pressed buttonPressed button_pressed
background/primaryPressed backgroundPrimaryPressed background_primary_pressed
Название иконки iOS Android
ic/24/sound_off ic24SoundOff ic_24_sound_off
Название иллюстрации iOS Android
img/demo/camera_archive imgDemoCameraArchive img_demo_camera_archive

ic/размер/названиеic/24/openimg/группа/названиеimg/zero/nointernet.«дизайнеру приложений: как создать и передать в разработку тёмную тему»figma-export.yaml

Почему мобильным разработчикам неудобно экспортировать ресурсы из Figma

Проблема #2: неудобный экспорт иконок стандартными средствами

ic/24/tab/profileic24TabProfile.pdfsnake_caseic_24_tab_profile.xml.Preserve Vector Data, Single Scale, Render as Template Image.Чего мы хотим как разработчики:

Почему Zeplin не помог:

  • он не поддерживает темную тему;
  • не позволяет иметь несколько цветов с одинаковым HEX значением, но разными названиями: если называть цвета по месту их применения, то может получиться так, что два цвета будут иметь разные названия, но одинаковые HEX значения. Например, backgroundPrimaryPressed (цвет главного фона при нажатии) и backgroundSecondary (цвет второстепенного фона) должны иметь одинаковые HEX значения. Zeplin не позволит такое сделать. Есть обходной путь — изменить HEX значение на минимально возможную величину. Пример #F4F5F8 и #F4F5F7;
  • требует дополнительные ресурсы дизайнера на синхронизацию макетов и UI-кит с Figma;
  • он стоит дополнительных денег. Figma для организации стоит $12 на дизайнера в месяц. Если покупать Zeplin, то это ещё $10.75 на дизайнера в месяц;

Out of process loading

Sometime you need to provide drawables in places where you don’t control when or how they are loaded. For example: notifications, homescreen widgets or some assets specified in your theme (e.g. setting which is loaded by the platform when creating a preview window). In these cases you aren’t responsible for loading the drawable so there’s no opportunity to integrate AndroidX support and you cannot use vectors pre-API 21 .

You can of course use vectors on API 21+ but be aware that you might not enjoy the features/bugfixes provided by AndroidX. For example while it’s great that AndroidX backports , a vector which uses this outside of AndroidX support on an API 21–23 device won’t understand this attribute. For this specific example, I’ll cover how to convert at design time in the next article. Otherwise, you may need to provide alternate resources for different API levels:

res/  drawable-xxhdpi/    foo.png             <-- raster  drawable-anydpi-v21/    foo.xml             <-- vector  drawable-anydpi-v24/    foo.xml             <-- vector with fancy features

Note that we need to include the resource qualifier here in addition to the api level qualifier. This is due to the way that works; any asset in would be considered a better match then one in just .

X Marks the Spot

Hopefully this article has highlighted the benefits of using the AndroidX vector support and some limitations that you need to be aware of. Using the AndroidX support both enables vectors on more platform versions and backports functionality but also sets you up to receive any future updates.

Now that we understand both why and how you should use vectors, the next article dives into how to create them.

Coming soon: Creating vector assets for AndroidComing soon: Profiling Android s

Настройки в Android Studio

Рассмотрим настройки, доступные в Android Studio. Закройте текущий проект, чтобы увидеть стартовое окно студии. В правой части нажмите на пункт Configure. В следующем окне выберите пункт Settings, чтобы оказаться в окне настроек студии. В левой части найдите пункт Build, Execution, Deployment, затем подпункт Build Tools, далее подпункт Gradle. По умолчанию, там всё чисто, только указан путь у Service directory path. Это были общие настройки.

Теперь рассмотрим настройки, относящиеся к проекту. Запустите любой проект в Android Studio. Выберите меню File | Settings…. Снова пройдитесь по пунктам Build, Execution, Deployment | Build Tools | Gradle. Вы увидите практически такое же окно с небольшими изменениями. Теперь поле Linked Gradle Projects не будет пустым, а также появятся дополнительные настройки. По умолчанию рекомендуют использовать Use default gradle wrapper.

Gradle Task

На правой стороне Android Studio имеется вертикальная вкладка Gradle, которую можно развернуть. Она содержит список задач (task), которая выполняет Gradle при работе с текущим проектом. Вы можете выделить любую из этих задач и запустить её двойным щелчком. Можно выделить несколько задач.

Узнать debug.keystore: MD5 и SHA1

Иногда требуется узнать значения debug.keystore: MD5 и SHA1. Обычно их получают через командную строку. Но это долго и неудобно, так как нужно помнить все аргументы. Есть способ проще. Открываем вкладку Gradle, нажимаем на кнопку со стрелками Refresh all Gradle Projects. Затем последовательно открываем элементы Tasks | android и запускаем команду signingReport. В нижнем окне Run увидите нужную информацию.

Gradle Console

Когда выполняется какая-то задача Gradle, то ход её выполнения можно увидеть в окне Gradle Console. Открыть её можно через вкладку Gradle Console в нижней правой части студии.

Terminal

Запускать задачи Gradle можно и в окне Terminal.

На панели инструментов имеется значок Sync Project with Gradle Files, которую следует использовать при редактировании файлов Gradle. Как правило, студия также выводит предупреждающее сообщение с ссылкой при изменении файла, которая делает ту же работу.

Добавление зависимостей через интерфейс студии

В статье описывался способ включения библиотеки в проект через редактирование файла build.gradle. Существует альтернативный вариант через настройки студии. Щёлкните правой кнопкой мыши на имени модуля (app) и выберите пункт Open Module Settings (быстрая клавиша F4). В правой части окна находятся вкладки, которые оказывают влияние на файл build.gradle. Например, вкладка Dependencies содержит подключаемые библиотеки.

Чтобы добавить новую зависимость, нажмите на значок с плюсом и выберите нужный вариант, например, Library dependency. Откроется список доступных библиотек из репозитория Maven.

Read and parse CSV file from asset folder

The following code shows how to
Read and parse CSV file from asset folder.

Register permission for

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.java2s.myapplication3.app" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="java2s.com"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.java2s.myapplication3.app.MainActivity"
            android:label="java2s.com"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Java code for main activity

package com.java2s.myapplication3.app;
fromwww.java2s.com
import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);
        setContentView(tv);

        try {
            AssetManager manager = getAssets();
            InputStream in = manager.open("data.csv");

            ArrayList<Person> cooked = parse(in);
            StringBuilder builder = new StringBuilder();
            for(Person piece : cooked) {
                builder.append(String.format("%s is %s years old, and likes the color %s",
                        piece.name, piece.age, piece.color));
                builder.append('\n');
            }
            tv.setText(builder.toString());

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /* Simple CSV Parser */
    private static final int COL_NAME = 0;
    private static final int COL_AGE = 1;
    private static final int COL_COLOR = 2;

    private ArrayList<Person> parse(InputStream in) throws IOException {
        ArrayList<Person> results = new ArrayList<Person>();

        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String nextLine = null;
        while ((nextLine = reader.readLine()) != null) {
            String[] tokens = nextLine.split(",");
            if (tokens.length != 3) {
                Log.w("CSVParser", "Skipping Bad CSV Row");
                continue;
            }
            //Add new parsed result
            Person current = new Person();
            current.name = tokens;
            current.color = tokens;
            current.age = tokens;

            results.add(current);
        }
        in.close();
        return results;
    }
}
class Person {
    public String name;
    public String age;
    public String color;

    public Person() { }
}

data.csv

Jack,Red,12
Jane,Black,13
Jode,Brown,14
  • Next »
  • « Previous
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector