Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Где посмотреть пакеты Activity для определенной версии андроида?

Нужно открыть активити контактов через приложение !! делаю это так:
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
public void openContactList(View v)
    {
        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.android.contacts", "com.android.contacts.DialtactsContactsEntryActivity"));
        startActivity(intent);
    }
Дело в том, что на андроид 4.4.2 всё работает, но на 4.2.2 программа вылетает!! думаю что проблема, в разных названиях пакетов где находятся контакты !!!!


Вопрос в следующем: как можно и где посмотреть эту часть (com.android.contacts и com.android.contacts.DialtactsContactsEntryActivity) для другой версии андроид (ну если это для всех версий одинаково где можно это найти)???
Ответ: например так
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
        if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            // названия класса и активити для версий до Китката
        } else {
            // Киткат и выше
        }
Вопрос: Как добавить действие (удаление файла) при установке приложения

Есть база данных, которая при открытии приложения проверяется на наличие ее в data/data и при отсутствии копируется туда из assets. Но при переустановке измененного приложения (если я решил базу что-нибудь добавить) база естественно не копируется, так как остается старая. Можно поставить удаление и запись в mainActivity, но тогда это будет заметно тормозить каждое открытие приложения.

Можно ли установить проверку и удаление базы при установке приложения?

Заранее спасибо!
Ответ:
Сообщение от EvgenyAseev
А не подскажите пожалуйста, как это правильно сделать?
Расскажу стратегию обработки, а как ты её реализуешь - это твоё дело.

Ко всем данным, которые объединены в логически цельный пакет,
добавляется дополнительные метаданные целью которых является
описание всех данных пакета.

Это может быть структура состоящая только из версии данных или
расширенная структура, которая позволяет разобраться в струтуре пакета.
Обычно достаточно только версии данных.

При работе программы, если требуется работать только с определённым форматом,
то проводится проверка версии данных. Если версия сопадает, то никаких действий не требуется.
Если версия неизвестная, то вероятно данные были повреждены, поэтому требуется пересоздать пакет.
Известную версию можно обновить до текущей.

Метаданные пакета данных можно хранить либо прямо в пакете либо отдельно.
Тут надо исходить от требований.
Приложение должно знать свою версию и как проверять метаданные.
Если метаданных нет, то пересоздать пакет и сохранять метаданные о пакете.
Вопрос: Как программно включить установку приложений из неизвестных источников

Имеется приложение в гугл плэе, думаю реализовать в нем механизм самообновления. Возник вопрос, можно ли программно реализовать включение режима разработчика и установку приложений из неизвестных источников?
Ответ: DemD10, да, но были бы они действительно умными, сделали бы один запрос для пользователя и показали галочку, которую выставив, приложение это может работать без спроса, былоб намного удобнее. Посмотрим как будет зефир работать.
Вопрос: Удаление APK-файла после установки приложения?

Удаление APK-файла сразу после установки приложения - возможно ли сие действие?

если да то как его реализовать?

Добавлено через 18 часов 58 минут
а ?
Ответ:
Сообщение от disx
я ему собираюсь apk кинуть в виде расшареной ссылки которую потом уберу
Он с успехом может просто сохранить apk из вашей ссылки у себя и потом раздать его всем желающим.
Не так давно я решал эту проблему в одном из своих проектов. Тоже с ориентацией на Китай и Корею Но проект пока не запущен. Текучка заела...
Единственный вариант делать персонифицированные приложения с последующей проверкой на своем сервере.
Вопрос: Какая версия Андроид лучше для игр?

Какая версия Андроид лучше для игр? К примеру на какой версии стабильнее работает гта сан андреас, на киткате или леденце?
Ответ: artemkotok, Пока лучше на киткате,но ситуация скорее всего в сторону лоллипопа меняться будет потихоньку
Вопрос: Как добавить версию андроид

Здравствуйте, появился такой вопрос, можно ли в проект добавить версию андроид(более старую), например минимальная версия была 4.4.4, а нужно сделать чтобы стала 4.0.3, в SDK её скачал, а как добавить не знаю, если добавить нельзя то как по другому делать, создавать новый проект и тупо копировать?
Ответ: Kulya1, ну так такие вещи нужно не спрашивать, а пробовать ИМХО
Вопрос: Версия андроид

Какая последняя версия андроид???
Ответ:

Не по теме:

Сообщение от DemD10
Предлагаю ввести голосование за самый "креативный" вопрос месяца.
На одном из программистских форумов была такая забава, "самый глупый вопрос месяца". Награда - подписка на самую одиозную спам-рассылку.



Добавлено через 2 минуты

Не по теме:

Но вообще, девушка во втором сообщении провела аналогию:

Вопрос: Попадает ли данное приложений “чат-консультант”, п

Приложения
Есть в планах создание несколько приложений, основной функционал которых будет консультация пользователей в чате, внутри приложения, по теме приложения (темы: подбор кредитов, ипотек, проверка кредитной истории)

Описание функционала приложения
1. После установки приложения, имеется 2 страницы интро, где объясняется как приложение может помочь пользователю
2. Открывается чат с нашим менеджером
3. Менеджер опрашивает пользователя, какая у него проблема
4. Менеджер предлагает 1-2 варианта решений, и приводит ссылки на сторонние партнерские сайты
5. После решение проблемы на партнерском сайте, пользователь возвращается в наше приложения для дальнейшей помощи.

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

Продвижение
Органический трафик из Google Play + реклама в Google Adwords

Вопрос
Основной вопрос: учитывая, что основная прибыль которую мы будем получать от приложений, будет от партнерских программа. Как Google к этому отнесется и не попадает ли данная схема монетизации под запрет: “Webviews and Affiliate Spam” -  
Учитывая, что цель приложений, не только любой ценой совершить продажу или регистрацию на оффере партнеров, а цель, дать квалифицированную информационную поддержку от нашего менеджера, и предложить пользователю варианты на каких ресурсах и за какую стоимость он может решить свою проблему.

Если данный метод описанный мной выше, попадает под запрет, то как можно реализовать монетизацию, чтобы приложение не попало под запрет?

Варианты которые возможно подойдут?
Создание информационного приложения, где будет предоставлена информация, как самостоятельно подобрать кредит, ипотеку, и проверить свой кредитный рейтинг. И будет возможность воспользоваться советом наших квалифицированных менеджеров, которые уже будут рекомендовать партнерские сайты
Ответ:
Приложения
Есть в планах создание несколько приложений, основной функционал которых будет консультация пользователей в чате, внутри приложения, по теме приложения (темы: подбор кредитов, ипотек, проверка кредитной истории)

Описание функционала приложения
1. После установки приложения, имеется 2 страницы интро, где объясняется как приложение может помочь пользователю
2. Открывается чат с нашим менеджером
3. Менеджер опрашивает пользователя, какая у него проблема
4. Менеджер предлагает 1-2 варианта решений, и приводит ссылки на сторонние партнерские сайты
5. После решение проблемы на партнерском сайте, пользователь возвращается в наше приложения для дальнейшей помощи.

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

Продвижение
Органический трафик из Google Play + реклама в Google Adwords

Вопрос
Основной вопрос: учитывая, что основная прибыль которую мы будем получать от приложений, будет от партнерских программа. Как Google к этому отнесется и не попадает ли данная схема монетизации под запрет: “Webviews and Affiliate Spam” -  
Учитывая, что цель приложений, не только любой ценой совершить продажу или регистрацию на оффере партнеров, а цель, дать квалифицированную информационную поддержку от нашего менеджера, и предложить пользователю варианты на каких ресурсах и за какую стоимость он может решить свою проблему.

Если данный метод описанный мной выше, попадает под запрет, то как можно реализовать монетизацию, чтобы приложение не попало под запрет?

Варианты которые возможно подойдут?
Создание информационного приложения, где будет предоставлена информация, как самостоятельно подобрать кредит, ипотеку, и проверить свой кредитный рейтинг. И будет возможность воспользоваться советом наших квалифицированных менеджеров, которые уже будут рекомендовать партнерские сайты
Вопрос: Приложение работает не во всех версиях Андроид

Приложение идеально работает только в версии 4.4.2. Проверено на 2 устройствах с этой версией. В Андроид 5.0.2 при нажатии на некоторые кнопки пишет, что устройство остановлено. А в Андроид 4.1.2 вообще при нажатии на кнопки открывает не те активити. С чем все это может быть связано?
Вот что в build.gradle:

Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
compileSdkVersion 22
    buildToolsVersion '22.0.1'
    defaultConfig {
        applicationId 'com.app.application'
        minSdkVersion 14
        targetSdkVersion 22
        versionCode 2
        versionName "2.0"
Разрешения в манифесте:

Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.install_packages"/>
    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.LOCATION_HARDWARE"/>
Ответ: Забыл дописать, что некоторые проблемы решает установка эмулятора. Эмуляторы на старых компах с малым объёмом ОЗУ - это мучение. Но на новых стандартный эмулятор с HASM (под процессоры Intel) работает достаточно быстро. Там и в Genymotion можно выбрать Android 5. Помогает не всегда, но иногда позволяет находить проблемы, которые обычно не воспроизводятся на реальных устройствах, и исправить их.
Вопрос: SQLite Андроид эмулятор и Железо по разному обрабатывают запросы

Столкнулся с задачкой по работе с SQLITE в общем в железе воплотить получилось, а в эмуляторе не работает, хочу понять почему.
Пожалуйста посмотрите исходники, если есть какие-то комментарии буду рад.
Повторюсь в Железе на GalaxySIV все работает отлично и никаких проблем я не вижу. В эмуляторе работает чуть лучше чем никак.
В коде есть все комментарии по этому поводу.

Кто готов помочь и оптимизировать мои сырцы, буду очень признателен.
Прошу конкретного решения, готового, если есть возможность пожалуйста напишите, Кнопка спасибо гарантирована

Кому хочется посквернословить в теме вроде "опять нубы фигней страдают" проходят мимо.
Может так сказаться, что мои ответы для Вас не всегда покажутся приятными и адекватными.



Все описание проблемы в коде:
В интерфейсе делаем кнопочку и текст вью, которое можно скролить:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="1">
 
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/scroll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
 
 
 
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:attr/textAppearanceMedium"
                    android:text="Medium Text"
                    android:id="@+id/yourpoints"
                    android:layout_weight="0.16" />
    </ScrollView>
 
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:onClick="Points"
        android:id="@+id/Points"
        android:layout_gravity="center_horizontal"
        android:layout_weight="0.16" />
</LinearLayout>
В коде пишем:
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
package com.example.helloworld;
 
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
 
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
 
 
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
 
 
public class FinalTry extends Activity
{
    //Устанавливаем таймер жизни записи (строки) в базе данных
    int timer = 60;
 
    //Говорим что будем работать с ТекстВью и кнопочкой
    TextView yourpoints;
    Button Points;
    //Активируем ДБХелпер
    DBHelper dbHelper;
    //Задаем переменную Времени, в виде строки
    String  mLastUpdateTime;
 
 
    private static final String DATABASE_NAME = "database.db";
    private static final String DATABASE_TABLE_TRACKER = "tracker";
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.morda);
 
        yourpoints = (TextView)findViewById(R.id.yourpoints);
        Points = (Button)findViewById(R.id.Points);
 
        dbHelper = new DBHelper(this);//говорим, что будем работать с БД в этом проекте, в дальнейшем откроем класс с названием DBHelper
 
  
        //Устанавливаем клик листнер
        Points.setOnClickListener(new View.OnClickListener()
 
        {
           @Override
           public void onClick(View v)
           {
            sqlTracker();
            }
        });
 
 
    }
 
 
    public void sqlTracker ()
    {
        // подключаемся к БД
        SQLiteDatabase db = dbHelper.getWritableDatabase();
 
        //Берем актуальное время
        mLastUpdateTime = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM).format(new Date());
 
       // создаем объект для данных
       ContentValues cv = new ContentValues();
        
        // получаем данные для ввода в таблицу
        String timeActual = new String(String.valueOf(mLastUpdateTime));
 
        //Получаем выборку из таблицы
        Cursor c = db.query(DATABASE_TABLE_TRACKER, null, null, null, null, null, null);
 
        // ставим позицию курсора на первую строку выборки
        // если в выборке нет строк, вернется false
 
            if (c.moveToFirst())//переходим на первую строку выборки
            {
                // определяем номера столбцов по имени в выборке
                int timeColIndex  = c.getColumnIndex("time"); // задаем переменную timeColIndex
 
 
                do {
 
                    //Читаем данные из таблицы
                    String timeCash = c.getString(timeColIndex);
 
                    //Делаем запись в текстовый вывод
                    SimpleDateFormat format = new SimpleDateFormat("dd.MM.yy HH:mm:ss");
                    Date d1 = null;
                    Date d2 = null;
                    long diff;
                    try {
                        d1 = format.parse(timeCash);
                        d2 = format.parse(mLastUpdateTime);
 
                        //Получаем разницу в секундах
                        diff = d2.getTime() - d1.getTime();
                        long diffSeconds = diff / 1000;
                        //Удаляем запись если она устарела больше чем указано в таймере
                        if (diffSeconds > timer)
                            {
                            //Со следующей строчкой засада, я бился больше суток, но никак не мог понять почему конструкция типа
                            //db.delete(DATABASE_TABLE_TRACKER, "time = "+timeCash , null);//Не работает ни в какую, уже чуть мышку не разбил,
                            //было ощущение что тип данных в таблице SQL не соответсвует типу данных в переменной timeCash.
                            //Нашел подтверждение на одном из форумов, что нужно поставить одинарные ковычки, в итоге изобрел костыль описанный ниже.
                            //С ним на реальном устройстве, (galaxy S4 - 5 версия андроида) все работает хорошо, никаким проблем нет, все так, как я задумывал.
                            //Но вот незадача в эмуляторе на гуглофоне нексус S не хочет кнопочка отрабатывать и никаких ошибок не выдает, и из базы данных SQL ничего
                            //не удаляет. Записи в SQL делает, но сообщение в ТексВью yourpoints.append не выводит, как будто вообще ничего не делает приложение.
                            //Но если к таблице SQL коннектиться на прямую через ADB то видно что записи в таблице создаются, но не удаляются.
                            //В общем следующая конструкция (костыль) отлично работает на моем аппарате, но не работает в эмуляторе, помогите разобраться.
                            db.delete(DATABASE_TABLE_TRACKER, "time = "+new String(String.valueOf("'"+timeCash+"'")) , null);
                            yourpoints.append("\nReading \n" + timeCash);
                            }
                        String difStr =  new String(String.valueOf(diffSeconds));
                        yourpoints.append("\nCalc \n"+difStr+"\nnow-"+d2+"\nSQl-"+d1);
                        } 
                    
                    catch (ParseException e) 
                        {
                        e.printStackTrace();
                        }
 
                        //Записываем новое время в базу
                    }
                        while (c.moveToNext());
                        long rowID =0;
                        cv.put("time", timeActual);
                        rowID = db.insert(DATABASE_TABLE_TRACKER, null, cv);
                        //Закрываем доступ к базе
                        c.close();
            }
            else
            {
                //Если не отработало условие выше, просто создаем новую запись в таблице и закрываем доступ
                long rowID =0;
                cv.put("time", timeActual);
                rowID = db.insert(DATABASE_TABLE_TRACKER, null, cv);
                c.close();
                yourpoints.setText("Соединение закрыто данные записаны");
            }
 
    }
 
 
//Описание класса DBHelper
    private class DBHelper  extends   SQLiteOpenHelper
    {
        public DBHelper (Context context)
        {
        //конструктор суперкласса, версия базы данных
        super (context ,   DATABASE_NAME ,  null ,   1 ) ;
        }
 
        @Override
        public void onCreate(SQLiteDatabase db) {
 
            // создаем таблицу с полями
            db.execSQL("create table "+ DATABASE_TABLE_TRACKER + " ("
          + "id integer primary key autoincrement, "
          + "time text "
 
          +         ");" );
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS "+ DATABASE_TABLE_TRACKER);
            onCreate(db);
        }
    }
 
}
Ответ: Нашел.
Кликните здесь для просмотра всего текста
12-15 17:55:35.540 12732-12732/com.example.helloworld W/System.err﹕ java.text.ParseException: Unparseable date: "12/15/15 7:57:57 AM" (at offset 2)

Не может спарсить дату, не понимаю почему.
На железе все отлично.

Добавлено через 1 минуту
Сообщение от YuraAAA
Я бы удалил приложение сначала и поставил заново
Проверялось не то что с нуля каждый раз, а на разных версиях андроида, и на 4 и на 6, везде одно и тоже

Добавлено через 3 минуты
Java(TM) 2 Platform Standard Edition 5.0
1
mLastUpdateTime = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM).format(new Date());
Я так понимаю что на разных версиях устройств по разному создается дата?
В Гуглофоне берется такой тип: 12/15/15 7:57:57 AM
А в самсунге создается dd.MM.yy HH:mm:ss

В этом проблема?
Я задаю маску
Java(TM) 2 Platform Standard Edition 5.0
1
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yy HH:mm:ss");
Как обойти эту проблему чтобы на разных устройствах все работало одинаково корреатно?

Добавлено через 3 часа 30 минут
Все решил проблемку.
Нужно строго задавать маску на получение даты, и она соответсвовать должна маске для чтения
заменил это
Java(TM) 2 Platform Standard Edition 5.0
1
mLastUpdateTime = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM).format(new Date());
на это
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
        Date currentDate = new Date();
        SimpleDateFormat dateFormat = null;
        dateFormat = new SimpleDateFormat("dd.MM.yy HH:mm:ss");
        mLastUpdateTime = dateFormat.format( currentDate );
Заработало