Закрыт. Этот вопрос не по теме. Ответы на него в данный
момент не принимаются.
Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы он соответствовал тематике «Stack Overflow на русском».
Закрыт 4 года назад.
Есть интернет-магазин, нужно написать для него приложение, а точнее для работы с
его админкой.
Основными функциями должны быть:
добавление/изменение/удаление товаров
просмотр списка заказов
просмотр категорий/подкатегорий/товаров в виде дерева или каких-то
выпадающих списков
В качестве обмена данными с сервером используются REST API. В ответ сервер отдает JSON.
Для выполнения запросов использую ApacheHttpClient (смотрю в сторону библиотеки Volley).
Для этого у меня создан класс со статическими переменными и методами для каждого запроса.
На данном этапе интересует следующее:
в главном Активити есть кнопка "получить древо категорий" —» вызывается класс со
статическим методом для данного запроса —» в ответ получаю JSON-ом список категорий/
подкатегорий.
Коротко о работе приложения:
В MainActivity пользователь нажимает на кнопку найти товар по id -->> вызывается
асинхронный запрос который обращается к статическому методу класса API.getProductById(String
id) -->> метод посылает нужный запрос на сервер и получает от него ответ -->> далее
метод .getProductById(String id) отправляет ответ в MainActivity -->> в MainActivity
формируется интент с получеными данными и отправляется в нужную активити где и отображаются
данные для пользователя.
Вопросы:
1) правильный ли я использую подход для выполнения запросов?
2) как поступить с полученным ответом, где и как его лучше хранить, возможно использовать БД?
3) каким способом можно отобразить данное дерево в Активити, что бы при нажатии на
товар я мог просмотреть о нем информацию?
КАТЕГОРИЯ
-подкатегория
-товар
-товар
-подкатегория
-товар
-товар
4) Какая иерархия классов должна присутствовать в подобном приложении.
5) Так же интересует: архитектура подобных приложений и какие средства используются
для их реализации? Возможно какие-то примеры, литература...
P.S. Это первый опыт написания функционально приложения для Android с помощью Java,
буду рад любой информации!
Ответы
Ответ 1
Вы немного неверно строите архитектуру. Вам надо:
Вынести обращения к серваку в отдельный сервис, который крутится в своем потоке -
см. в сторону IntentService
Полученые от Rest API данные надо складывать в SQLite БД, иначе если не будет коннекта
или коннект будет медленный у вас ничего не будет показываться.
Показывать нужно всегда данные из БД, причем посредством ContentProvider над этим
БД. ContentProvider должен давать вам Cursor, а от курсора вы должны рисовать уже свои
деревья/списки.
В итоге получится так, что в фоне у вас будет крутиться сервис, который подсасывает
данные из сервера и кладет в БД. Ну а поскольку над БД у вас будет развернут ContentProvider
то все изменения которые будет вносить сервис в БД будет автоматом отображаться на UI.
Для рисования списков в последнее время модным стало использование RecyclerView,
он лучше себя ведет в тяжелых списках с картинками, правда и кода он требует чуток
больше чем ListView.
Как то так.
Вот такая ошибка в android studio
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException:
org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_65\bin\java.exe''
finished with non-zero exit value 1
Вот build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.example.chingiz.diplom"
minSdkVersion 17
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile files('libs/google-api-services-youtube-v3-rev124-1.19.0.jar')
compile files('libs/google-api-client-1.21.0.jar')
compile files('libs/google-oauth-client-1.21.0.jar')
compile files('libs/google-http-client-1.21.0.jar')
compile files('libs/jsr305-1.3.9.jar')
compile files('libs/google-http-client-jackson2-1.21.0.jar')
compile files('libs/jackson-core-2.1.3.jar')
compile files('libs/google-api-client-android-1.21.0.jar')
compile files('libs/google-http-client-android-1.21.0.jar')
compile files('libs/picasso-2.5.2.jar')
}
Подскажите что может быть?
Ответы
Ответ 1
Это не обязательно именно ваш случай, но, глядя на количество jar-библиотек в вашем
проекте, думаю, очень вероятный сценарий. Когда какие-то из зависимостей дублируют
друг друга, при попытке компиляции появляется точь-в-точь такая же ошибка, как у вас.
Проверить, нет ли у вас дублируемых зависимостей можно открыв терминал в папке с
проектом и прописав там команду ./gradlew имяпроекта:dependencies.
Оцените визуально это дерево на предмет повторяющихся зависимостей. Если они есть
- ликвидируйте их и компилируйте заново.
В моей практике такое было, и справился с этой ошибкой именно этим путём.
P.S.
А ещё, чтобы логи при подобных ошибках были более развёрнутыми, зайдите в Settings
-> Build, Execution, Deployment -> Build Tools -> Compiler и пропишите там в поле Command-line
Options --stacktrace
Я сделала виджет) который показывает статистику и новости, с сайта. Всё работает
отлично. Я хочу чтоб он обновлялся, когда данные страницы меняются. Первая идея была
делать запрос, и если данные изменились, то выводить уже к примеру уведомление."новые
новости". Но начала читать и пишут, что это антипаттерн, так делать нельзя, тк батарея
садится. А как тогда сделать? Есть ли возможность обновить виджет сразу, после такого
как изменились определенные данные на страничке?
Ответы
Ответ 1
Есть мысль использовать Push-уведомления и обновлять данные, когда придет пуш на
устройство. Идея такая: веб-мастер правит страницу - посылается пуш на девайс - а далее
несколько вариантов: либо особый запрос слать на сервер, либо какие-то данные получать
из пуша. Но максимальный размер пуша - 4КБ.
Ну и способ влоб вы уже частично описали: запрос в AlarManager, который например
раз в час будет долбить сервер и обновлять виджет.
В общем есть приложение, имеет 3 активити:
Loading Page (splash screen);
WebView для конкретного сайта;
Активити с картинкой об отсутствии интернета.
Вопрос: как во время работы 1 активити проверить подключение к интернету и, в случае
если его нет, кинуть на 3 активити, а если есть, то на 2?
Ответы
Ответ 1
Обычно советуют решения на базе ConnectivityManager, но оно показывает лишь факт
подключения к какой-либо сети, что не говорит о том, что есть связь с интернетом. Если
вы подключитесь к локальной сети по Wi-fi, то метод вернёт true, но доступа к интернету
может и не быть, т.к. это локальная сеть.
Я бы рекомендовал пинговать адрес, чтоб наверняка сказать, есть ли инет:
public boolean isOnline() {
Runtime runtime = Runtime.getRuntime();
try {
Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
int exitValue = ipProcess.waitFor();
return (exitValue == 0);
}
catch (IOException e) { e.printStackTrace(); }
catch (InterruptedException e) { e.printStackTrace(); }
return false;
}
Можно прям из UI потока.
Или подключиться попробовать:
public boolean isOnline() {
try {
int timeoutMs = 1500;
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);
sock.connect(sockaddr, timeoutMs);
sock.close();
return true;
} catch (IOException e) { return false; }
}
Нужен пермишен:
Но это не будет работать в UI потоке, нужно завернуть, к примеру, в AsyncTask:
class InternetCheck extends AsyncTask {
private Consumer mConsumer;
public interface Consumer { void accept(Boolean internet); }
public InternetCheck(Consumer consumer) { mConsumer = consumer; execute(); }
@Override protected Boolean doInBackground(Void... voids) { try {
Socket sock = new Socket();
sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500);
sock.close();
return true;
} catch (IOException e) { return false; } }
@Override protected void onPostExecute(Boolean internet) { mConsumer.accept(internet); }
}
Использовать так:
new InternetCheck(internet -> { /* делаем здесь что-то после получения результата */ });
Источник
Делаю простенькую карточную игру. Разложено несколько карт и я хочу, чтобы при нажатии
на любую из них она переворачивалась с использованием анимации.
Подскажите, не могу понять, какую анимацию и как правильно использовать.
Ответы
Ответ 1
Использую вот такой класс:
public class FlipAnimation implements Animation.AnimationListener {
private Animation animation1;
private Animation animation2;
private boolean isBackOfCardShowing = true;
private ImageView img;
private Context ctx;
private FlipEnd flipped;
Card card;
public interface FlipEnd {
void flipEnd(ImageView img, Card card);
}
FlipAnimation(Context ctx, ImageView img, Card card) {
this.img = img;
this.ctx = ctx;
this.card = card;
flipped = (FlipEnd) ctx;
animation1 = AnimationUtils.loadAnimation(ctx, R.anim.flip_to_middle);
animation1.setAnimationListener(this);
animation2 = AnimationUtils.loadAnimation(ctx, R.anim.flip_from_middle);
animation2.setAnimationListener(this);
img.clearAnimation();
img.setAnimation(animation1);
img.startAnimation(animation1);
}
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
if (animation == animation1) {
if (isBackOfCardShowing) {
img.setImageResource(R.drawable.card_face);
flipped.flipEnd(img,card);
} else {
img.setImageResource(R.drawable.card_back);
}
img.clearAnimation();
img.setAnimation(animation2);
img.startAnimation(animation2);
} else {
isBackOfCardShowing = !isBackOfCardShowing;
}
}
@Override
public void onAnimationRepeat(Animation animation) {
}
}
Тут еще сразу добавлен интерфэйс, чтобы отслеживать, когда и какая карта перевернулась.
Кастомизируйте его, как хотите.
R.anim.flip_to_middle.xml :
flip_from_middle.xml:
Вызывать там, где надо: new FlipAnimation(YourActivity.this, cardImage);
Попробуйте, эффект будет как будто переворачивается карта :)
При попытке запустить созданный простейший проект, когда уже выбрал виртуальное устройство,
выскакивает сообщение об ошибке - Failed to complete gradle execution
Вот пишет в Gradle Console
Build failed with an exception.
What went wrong:
Execution failed for task
':app:preDexDebug'.
com.android.ide.common.internal.LoggedErrorException:
Failed to run command:
C:...\build-tools\21.1.1\dx.bat --dex
--output C:...\build\intermediates\pre-dexed\debug\internal_impl-21.0.2-255816edbbf414e2d0b1a5ac3a093bcb291d606e.jar
C:...\build\intermediates\exploded-aar\com.android.support\support-v4\21.0.2\libs\internal_impl-21.0.2.jar
Error Code: 1 Output: Try: Run with
--stacktrace option to get the stack trace. Run with --info or --debug
option to get more log output. BUILD
FAILED
Ошибки в Gradle не подсвечивает
Ответы
Ответ 1
Возможно, ему недостаточно памяти, попробуйте в настройках File-->Setting-->Gradle--
в окне Gradle Vm Option добавить -Xmx256m.
Такая ошибка была в версии Tool 24.0.0, в новых версиях ее пофиксили.
Проблема в файле tools/lib/find_java.bat в строке 27 лишний пробел после arch_ext=32
find /i "x86" > NUL && set arch_ext=32 || set arch_ext=64. Правильный запрос выглядит
так find /i "x86" > NUL && set arch_ext=32|| set arch_ext=64.
Ответ 2
Скачайте новый build-tools (на текущий момент 21.1.2 актуален) и в build.gradle поменяйте
buildToolsVersion "21.0.2" на "21.1.2". Тут проблема не в gradle, т.к. он просто делает
сборку, используя ресурсы, а, скорее всего, в криво ставшем SDK. На всякий случай переместите
SDK в корень директории, хотя в AS, вроде, поправили проблему кодировки, но я особо
не проверял.
Ответ 3
Была такая же ошибка. При помощи системы контроля версий установил что проблема в
файле dimens.xml
Вместо
100dp
использовал
100
(разница в отсутствии dp).
Возможно кому-то поможет.
Добрый день!
Почему-то не работает ввод русских букв в EditText в Android Studio. Пробовала через
стандартный эмулятор и Genimotion. Как только меняю раскладку - пишет на англ. нормально,
на русском не пишет, даже в логах ничего нет.
Заранее спасибо.
Ответы
Ответ 1
В случае с Genymotion вам поможет включение в настройках эмулятора (в списке эмуляторов)
использования виртуальной клавиатуры.
Ответ 2
В настройках Android в эмуляторе нужно выбрать русский язык.
Как сменить эмулятор на второй, если поставил галку не спрашивать больше, а запускать
на ранее выбранном?
Нужно снова окно выбора — на чем запускать.
Ответы
Ответ 1
Run -> Edit Configuration -> Вкладка: General -> Секция: Target Device -> отметить
"Show chooser dialog" - показать диалог выбора устройства для запуска приложения.
либо
Run -> Edit Configuration -> Вкладка: General -> Секция: Target Device -> отметить
"Emulator" и в выпадающем списке ниже выбрать другой эмулятор из имеющихся. Будет запускаться
на выбранном эмуляторе.
Короткий путь: В тулбаре студии (значки с действиями сверху) кнопка со значком андроида
и названием программы, левее зеленого треугольника запуска приложения. Нажать на нее
- в выпавшем меню будет пункт "Edit configuration" - дальше так же, как выше.
В сети много информации об этом не хитром деле, но мне все же не понятен один момент.
Есть 2 android - приложения. Для этих двух приложений существует общая библиотека.
Эта схема успешно работала в Eclipse.
Сейчас же, когда перешел на Android Studio, я пытаюсь повторить тот же фокус (разными
способами), но у меня не получается.
Я хочу сделать ссылку на указанный библиотечный проект. Чтоб все изменения сразу
отражались во всех приложениях, к которым эта библиотека подключена. А все что у меня
получается это с сделать копию библиотечного проекта. В таком случае не о какой общности
библиотеки речи не идет.
Как быть?
Ответы
Ответ 1
Android Studio для сборки проекта использует систему сборки Gradle, поэтому решается
данный вопрос через возможности именно данной системы сборки, а не непосредственно
Android Studio
Для того, чтобы подключить в свой проект другой, независимый от текущего, проект
(например, разрабатываемую вами же библиотеку) в Android Studio, необходимо в файле
settings.gradle текущего проекта добавить ссылку на другой проект:
include ':myLibrary'
project(':myLibrary').projectDir = new File('../MyProjects/myLibrary')
Здесь мы подключаем к текущему проекту проект myLibrary.
../MyProjects/myLibrary - путь до подключаемого проекта.
Ссылка на подключенный проект появится в дереве файлов Android Studio, при редактировании
вы будете вносить изменения непосредственно в сам проект, а не его копию в текущем проекте.
Теперь при сборке вашего текущего проекта в него будет включен и подключенный проект,
при этом данный проект не будет импортирован в текущий и вы можете вносить изменения
в тот подключенный проект, тогда они будут учитываться при следующей сборке во всех
проектах, в которых он подключен таким образом.
Пост на EnSO с картинками
Ответ 2
Сделайте библиотеку отдельным проектом и при компиляции публикуйте ее в каком-нибудь
репозитории. В локальном Maven, к примеру.
А в любом проекте просто подключайте ее из репозитория, как и любую другую библиотеку.
Помогите исправить проблему при подключении физического устройства на Ubuntu 14.04!
Сделал все настройки но студия не распознает смартфон (android 4.2)
Ранее возникала такая проблема, но старыми методами не решилось!
Использовал данную инструкцию.
Ответы
Ответ 1
Мне всегда помогает выбор подключения - Камера (PTP). Его можно выбрать в верхней
сдвигающейся шторке.
Не получается настроить автозапуск сервиса при загрузке телефона. BroadcastReceiver
просто не отрабатывает.
В манифесте:
Код ресивера
public class MyReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Log.d("======MyReceiver=======", "------onReceive-----");
context.startService(new Intent(context, MyService.class));
}
}
После установки перед перезагрузкой запускал, тестировал приложение, как сказано здесь
Пробовал добавлять другие интент-фильтры:
От прочих системных событий ресивер тоже не срабатывает. Зато вполне успешно запускается
при вызове из другого приложения таким кодом:
Intent intent = new Intent();
intent.setAction("com.example.andrey.myapplication.TEST");
sendBroadcast(intent);
Ответы
Ответ 1
Я думаю ,что проблема в заглавных буквах. action name на самом деле должен выглядеть, как
android.intent.action.BOOT_COMPLETED
Ответ 2
Возможно надо не капсом писать, а вот так: android.intent.action.BOOT_COMPLETED
Выводится такой красный прямоугольник когда вывожу строки в Resources. strings.xml
c с комбинацией ALT+ENTER , как только появляется этот прямоугольник комбинация ALT+ENTER
не работает! Приходится закрывать окно и заново открывать после чего комбинация работает
, до следушего появления прямоугольника, что обычно происходит после перврго или второго
вывода строки в strings.xml
Ответы
Ответ 1
В моем случае данных прямоугольник появляться после дублирования строки.
Создается новая строка кода и текст который выделен красным можно редактировать.
Если нажать Enter то текст перестает подсвечивать.
Ответ 2
Не совсем понял как воссоздать данную проблему у себя, но:
Alt + Enter используется для вывода всяких подсказок(в случае синтаксических и подобных
ошибок) и выполнения дополнительных действий.
А в данном случае, я так понимаю, необходимо использовать автокомплит - комбинацию
Ctrl + Space - тогда буду предоставлены возможные варианты.
А красный прямоугольник обычно вроде показывал какой из параметров или аргументов
необходимо заполнить в данным момент.. по крайней мере так для методов было.
Дано:
Файл с паролями, коий не надо заливать на GitHub.
В .gitignore этот файл прописан и в студии помечен серым цветом.
Проблема:
При коммите сей файл отмечен и выделен в списке файлов для коммита:
Вопрос:
Что таки произойдёт при коммит->пуш? Файл сохранится на GitHub и будет всем доступен
или просто в истории коммитов будет значится как добавленный в проект но существовать
физически будет только на моей машине из-за добавления в gitignore?
P.S.
т.к. в файле пароли и явки пробовать сам опасаюсь(
Ответы
Ответ 1
Удалось решить проблему удалив файл из проекта, сделав коммит без него и добавив
его снова.
После этих манипуляций файл перестал появляться в списке файлов для коммита.
Видимо надо сначала составлять .gitignore а потом уже только добавлять в проект игнорируемые
файлы.
Согласно ссылке @Yura Ivanov, для тех, кто умеет в командную строку достаточно выполнить
такую команду для игнорирования файлов, добавленных до изменения .gitignore:
git rm --cached
Добрый день, пишу в Android Studio под версию устройства Android 4 как можно в этом
же проекте поднять версию до Android 6 ?
Ответы
Ответ 1
Если имеется в виду минимальная поддерживаемая версия ОС, то укажите её в build.gradle
(module app). Вам требуется изменить значение переменной minSdkVersion в блоке defaultConfig
на 23
LogcatEvent LogДобавляя тестовый ad unit ID(с офиц. сайта AdMob for Androids)(ca-app-pub-3940256099942544/6300978111),
всё работает отлично, и тип эта реклама поздравляет меня, что я смог её разместить.
Но стоит мне поставить мой ad unit ID(моего приложения), ничего не появляется...
Вот собственно файлы и их коды:
activity_main.xml:
MainActivity.java:
package app.notruetester.ru.tets;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.TextView;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.MobileAds;
import java.util.Random;
public class MainActivity extends AppCompatActivity{
private AdView mAdView;
TextView textView,textView2;
Button button;
EditText editText;
CheckBox checkBox,checkBox2,checkBox3,checkBox4,checkBox5,checkBox6;
AdView adView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
textView2 = (TextView) findViewById(R.id.textView2);
button = (Button) findViewById(R.id.button);
editText = (EditText) findViewById(R.id.editText);
textView.setTextSize(20);
editText.setText("2");
checkBox = (CheckBox) findViewById(R.id.checkBox);
checkBox2 = (CheckBox) findViewById(R.id.checkBox2);
checkBox3 = (CheckBox) findViewById(R.id.checkBox3);
checkBox4 = (CheckBox) findViewById(R.id.checkBox4);
checkBox5 = (CheckBox) findViewById(R.id.checkBox5);
checkBox6 = (CheckBox) findViewById(R.id.checkBox6);
// AdView adView = AdView(this);
// adView.setAdSize(AdSize.BANNER);
// adView.setVisibility(View.VISIBLE);
MobileAds.initialize(this, "XXXX");
mAdView = (AdView) findViewById(R.id.ad_view);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
}
public void onButtonClick(View view){
if (!checkBox.isChecked() & !checkBox2.isChecked() & !checkBox3.isChecked() &
!checkBox4.isChecked() & !checkBox5.isChecked() & !checkBox6.isChecked() ){
checkBox3.setChecked(true);
checkBox4.setChecked(true);
}
String pass = "";
Random r = new Random();
int a= (editText.getText() == null)?0:Integer.parseInt(editText.getText().toString());
int cntchars = a + r.nextInt(1);
String values = "";
if (checkBox.isChecked()){
values += "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";}
if (checkBox2.isChecked()){
values += "!@#$%^&*()";}
if (checkBox3.isChecked()){
values += "0123456789";}
if (checkBox4.isChecked()){
values += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";}
if (checkBox5.isChecked()){
values += "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";}
if (checkBox6.isChecked()){
values += "abcdefghijklmnopqrstuvwxyz";}
int length = values.length();
for (int i = 0; i < a; ++i) {
Random rnd = new Random(System.currentTimeMillis());
int number = 0 + rnd.nextInt(length - 0 + 1);
pass += (char)((r.nextInt(values.length())) + values.charAt(number));
}
textView2.setText(pass);
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("")
.setMessage("Сгенерированный пароль скопирован в буфер обмена")
.setCancelable(false)
.setNegativeButton("ОК, понял, спасибо",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
AndroidManifest:
Стате, если кто-то не понял и кому-то интересно, что за проект я пишу, то это генератор
паролей(просто так, вдруг это как-то поможет)
P.S. У рекламного баннера свойство visibility стоит как visible
Собственно сам вопрос:
Как заставить AdMob работать нормально?
Прошу помочь, буду очень благодарен, бьюсь уже второй день с этой проблей((
Больше LogCat'а:
08-31 13:00:40.311 2659-9883/app.notruetester.ru.tets D/dalvikvm: GC_FOR_ALLOC freed
53K, 17% free 4793K/5752K, paused 3ms, total 3ms
08-31 13:00:40.315 2659-9883/app.notruetester.ru.tets W/GooglePlayServicesUtil: Google
Play services is missing.
08-31 13:00:40.315 2659-2659/app.notruetester.ru.tets W/Ads: The webview is destroyed.
Ignoring action.
08-31 13:00:40.375 2659-2659/app.notruetester.ru.tets I/Ads: Scheduling ad refresh
60000 milliseconds from now.
08-31 13:00:40.375 2659-4529/app.notruetester.ru.tets W/GooglePlayServicesUtil: Google
Play Store is missing.
08-31 13:00:40.379 2659-2659/app.notruetester.ru.tets I/Ads: Ad finished loading.
08-31 13:00:40.379 2659-2659/app.notruetester.ru.tets D/webviewglue: nativeDestroy
view: 0xb831b7f8
08-31 13:00:40.395 2659-2761/app.notruetester.ru.tets W/PicturePileLayerContent:
Warning: painting PicturePile without content!
08-31 13:00:40.395 2659-2761/app.notruetester.ru.tets W/PicturePileLayerContent:
Warning: painting PicturePile without content!
08-31 13:00:41.703 2659-2761/app.notruetester.ru.tets W/PicturePileLayerContent:
Warning: painting PicturePile without content!
08-31 13:00:41.979 460-523/system_process D/MobileDataStateTracker: default: setPolicyDataEnable(enabled=true)
08-31 13:01:40.379 2659-2659/app.notruetester.ru.tets I/Ads: Starting ad request.
08-31 13:01:40.379 2659-2659/app.notruetester.ru.tets I/Ads: This request is sent
from a test device.
08-31 13:01:40.383 2659-10781/app.notruetester.ru.tets W/GooglePlayServicesUtil:
Google Play Store is missing.
08-31 13:01:40.383 2659-10781/app.notruetester.ru.tets W/GooglePlayServicesUtil:
Google Play Store is missing.
08-31 13:01:40.455 2659-10786/app.notruetester.ru.tets D/dalvikvm: GC_FOR_ALLOC freed
822K, 18% free 4743K/5752K, paused 14ms, total 15ms
08-31 13:01:40.707 2659-10786/app.notruetester.ru.tets D/dalvikvm: GC_FOR_ALLOC freed
768K, 18% free 4737K/5752K, paused 7ms, total 7ms
08-31 13:01:40.711 2659-10786/app.notruetester.ru.tets D/dalvikvm: GC_FOR_ALLOC freed
36K, 17% free 4782K/5752K, paused 2ms, total 2ms
08-31 13:01:40.715 2659-10786/app.notruetester.ru.tets I/dalvikvm-heap: Grow heap
(frag case) to 4.879MB for 36886-byte allocation
08-31 13:01:40.715 2659-10786/app.notruetester.ru.tets D/dalvikvm: GC_FOR_ALLOC freed
24K, 18% free 4794K/5792K, paused 4ms, total 4ms
08-31 13:01:40.723 2659-10786/app.notruetester.ru.tets W/GooglePlayServicesUtil:
Google Play services is missing.
08-31 13:01:40.723 2659-2659/app.notruetester.ru.tets W/Ads: The webview is destroyed.
Ignoring action.
08-31 13:01:40.751 2659-2659/app.notruetester.ru.tets D/webviewglue: nativeDestroy
view: 0xb84970c8
08-31 13:01:40.763 2659-2659/app.notruetester.ru.tets I/Ads: Scheduling ad refresh
60000 milliseconds from now.
08-31 13:01:40.763 2659-3635/app.notruetester.ru.tets W/GooglePlayServicesUtil: Google
Play Store is missing.
08-31 13:01:40.771 2659-2659/app.notruetester.ru.tets I/Ads: Ad finished loading.
08-31 13:01:40.787 2659-2761/app.notruetester.ru.tets W/PicturePileLayerContent:
Warning: painting PicturePile without content!
08-31 13:01:40.787 2659-2761/app.notruetester.ru.tets W/PicturePileLayerContent:
Warning: painting PicturePile without content!
08-31 13:01:41.827 2659-2761/app.notruetester.ru.tets W/PicturePileLayerContent:
Warning: painting PicturePile without content!
08-31 13:01:41.999 460-523/system_process D/MobileDataStateTracker: default: setPolicyDataEnable(enabled=true)
Ответы
Ответ 1
Вы используете не то значение при инициализации AdMob. А именно - у вас в строке
MobileAds.initialize(this, "ca-app-pub-8900900048721624/5809873614");
используется, видимо, ID баннера, а не ID приложения. Это 2 разных значения. Проверьте
в настройках приложения в AdMob какое значение вам надо подставить при инициализации.
Также захардкоженные размеры баннера не ОК. Лучше поставить ширину во весь экран
и высоту по содержимому.
Ну и выкладывать в общий доступ эти ID - плохая идея. Кто-то может их заюзать, накликать
очень много с одного девайса и ваш акк заблокируют навсегда за накрутку и вы ничего
не сможете доказать.
Я потерял свой ключ jks и из-за этого не могу обновить приложение в google play.
Можно ли его как-то заменить или восстановить?
Ответы
Ответ 1
Ничего сделать нельзя. Создавайте новый ключ и выкладывайте новое приложение с новым
пакетом.
Про приложение с утерянным ключом можно забыть навсегда. У Гугла вашего ключа нет
и получить его никак нельзя
Постоянно напрягает что при переключении в xml-файлы, по умолчанию, сначала открывается
вкладка Design а не Text. И постоянно приходится переключаться. Можно ли это изменить
в настройках?
Ответы
Ответ 1
Настройка "предпочитать XML редактор":
Settings.. -> Editor -> Layout Editor -> Prefer XML editor - отметить галочкой.
Можно ли и как с помощью android Studio загрузить картинку фона в приложении , чтобы
она преобразовалась сразу в форматы ldpi, mdpi, hdpi, xhdpi,xxhdpi,xxxhdpi
и какие разрешения при этом должны быть
Ответы
Ответ 1
С помощью плагина для Android Studio или IntelliJ IDEA Android Drawable Importer
Как назначить цену приложению в Google Play Console?
Ответы
Ответ 1
При заливке приложения не забыть сразу указать, что оно Платное. Иначе Бесплатное
потом невозможно будет перевести в Платное - так задумано! )
Зайти в Настройки своего акаунта
Зайти в Шаблоны цен
Создать Новый шаблон цен
Вернуться в приложение.
Зайти в Настройки страницы приложения > Цены и Распространение и назначить нужный
шаблон своему приложению
Рис. к пункту 2:
Рис. к пунктам 3,4: