Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Дефекты флешек после Android 4.2

Всем здравствуйте. Прошу помочь в следующем вопросе. Несколько лет назад был куплен новый планшет Samsung Galaxy Tab 3 10.1 P5210. К нему была куплена микросдишка Сандиск 64 гигабайта. Спустя какое то время, был куплен второй новый, точно такой же планшет и к нему была куплена флешка Сони, тоже 64 гигабайта. Недавно решили продать второй планшет. Оставшуюся флешку хотели почистить - ни в какую. Файлы с неё копируются, на ней ничего не удаляется, на неё ничего не записывается, пробовали форматировать СД форматтером - результат нулевой. Пробовали низкоуровневым на HDDLLF.4.40 - результат нулевой. Почитав похожие запросы, решили, что флешке пришёл конец. Недавно на втором планшете решили почистить флешку - тоже самое. Тут уже встаёт вопрос - А во флешках ли дело? Благо первую ещё не выкинули. Две разные флешки, на одинаковых осях и устройствах, и с одинаковыми проблемами. Может андроид что то творит?
Ответ: Отнёс флешки в СЦ... По результату отпишусь...
Вопрос: Установка Android на ноут с процом AMD A6-9220

Купил ребенку такой ноут. То, что к нему не оказалось вменяемых драйверов под Убунту и вообще Линукс на карту Wi-Fi и Bluetoth - это ещё полбеды, в конце концов сын скомпилял какой-то драйвер с гитхаба и Wi-Fi теперь есть. Синего зуба по прежнему нет, но пока не критично.

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

Есть у кого опыт установки Андроида на такой ноут?

P.S. сыну 12 лет, еже ли вче - пишите по проще .. спасибо.

Добавлено через 9 часов 59 минут
И в ответ тишина .. пришел с работы, дите спрашивает .. и что я ему ответить могу?
Ответ: Извиняюсь.
Просто мне показалось что это проблема конкретно этого проца от AMD, в который видеокарта - "встроена" и проблема достаточно распространена.

Ноут HP 15-bw613ur 15" (1920х1280) AMD A6-9220 2.5Ghz 4Gb RAM 128Gb SSD.

Android 6.1 64-х битная версия, скачан с легального сайта (не помню). Перелит на установочную флешку, на SSD он сделал раздел 21Gb "основной" и попытался, перезагрузившись с флешки установить Andriod. Сама установка в этот раздел - прошло без сообщений об ошибках, но при перезагрузке и выборе в grub ОС Андроид - экран идет рябью - устанавливается не поддерживаемый режим для "видеокарты", которая у этого проца - "встроенная", как понял.

Собственно все что было ..

С драйвером W-Fi и синезуба пошарился в Сети, понял что на этот чипсет его для Линуксов нет "де факто", тот гитхаб, где дитенок его нашел - в общем-то единственное место откуда его можно взять и скомпилять. Но, точно также народ жалуется что сетка поднимается, а синезуб - нет. Драйвер похоже недопилен ещё. Поэтому про синезуб и не спрашиваю..
Вопрос: Библиотека для android-разработчиков

Всем доброго времени суток.
Хотел бы представить мою библиотеку, при помощи которой я хотел бы упростить разработку android-приложений.

Подробно можно посмотреть тут:

Естественно, доступна в jcenter и подключается через градл:

Code
1
compile 'com.aizenberg:support:0.1.3'
Кратко, что она умеет:
  • Переключение фрагментов (очистка стэка, передача аргументов)
  • Лёгкий Event Bus
  • Cache
  • Настраиваемые логи
  • Итерация и фильтрация по Map<>
  • GeoLocation
  • Набор различных утилит (String, Network listener, Validation etc)

Стали бы ли вы ей пользоваться?
Что бы вы хотели ещё видеть в такой библиотеке?

Спасибо за внимание.
Ответ:
Сообщение от YuraAAA
Но тормозить работу они не будут
Всегда есть "косвенные" тормоза!

У меня на телефоне критически не хватает памяти на внутренней флешке! 20-40 программ и на следующую просто не хватает места... Уже забыл когда игрушки ставил... Даже на тест очередной мелкой утилиты иногда не хватает места - качается с плея, а потом пишет "нет места на установку" (на внутренней флешке). А эта либа еще 50-100кб добавляет(если не будет расти)... из тех что нельзя перенести на флешку внешнюю...

К тому-же при запуске это все должно ЗАГРУЗИТЬСЯ в память для работы (если правильно понимаю на основе того что выучил в винде), а значит И здесь лишние потери...

И лишние проблемы в скачивании программы через медленный мобильный интернет (сельский = с плохой связью).

И при отладке каждый лишний мегабайт забирает "полезную" секунду на каждой установке (а когда когда разработчику их надо сделать сотню-две в день - это убивает нервы)

Кликните здесь для просмотра всего текста
Как уже говорил, Лог-кет для меня "больная тема"! Много лет назад (больше 10) я писал ОЧЕНЬ сложный проект. Именно математика/логика сложная! Обычных логов в текстовик явно не хватало! Распечатывал и искал ошибки в 5ти-6ти страчичных 2х-3х столбцовых A4-отчетах мелким шрифтом... Начал менять под себя инструменты... Сейчас с трудом обхожусь СИЛЬНО модифицированным ЛогКет(все ранее перечисленное и даже больше). И все равно иногда этого мало. На делфи написал программу на основе перехвата ЛогКет - шикарно работает (но сам протокол ЛогКэт оказался не стабильным - иначе бы давно сделал общедоступной и возможно коммерческой, возможно когда-нибудь изучу сокеты на андроиде и реанимирую проект...)

так вот...когда-то в Делфи сэкономил почти мегабайт на каждой программе вынеся ВСЕ логи из ЕХЕ во внешнюю программу с доступом через ДЛЛ. Убирал DLL из папки и программа становилась "релизом". Сейчас по той-же технологии пытаюсь пойти... Пишу "внешнюю" утилиту для отладчика - она ретранслирует логи и является "ключом" для использования логов вообще... Кстати это дало довольно интересные возможности... счетчики компиляций по проектам (когда за какой проект брался, какая версия рабочая, хоть график работы с проектом), внешний запуск тестов, флайку "с прошлой компиляции прошло", флайку с мини-логами (удобнее Тост-ов), активация WiFi ADB, запись лог-кет в файл/базу для анализа работы в "длительных" оффлайн и много чего другого...
...может через несколько месяцев похвастаюсь...
Вопрос: Что с моим android смартфоном?

Перезагружаю, сбрасываю все настройки..через 1-5 дней перестают отображаться исходящие/входящие звонки, а недавно и воовсе стерлась записная книжка..Причем к интернету я не подключался после стирания всех настройек (hard reset), значит вирус не мог записаться, получается троян записан в саму память смартфона? флешки там нет.

Может быть мне продали б/у смартфон?

Версия android 4.2
Ответ: на каком-то смарте после каких-то действий пропадает инфа
к ясновидящим попробуйте обратиться, что-ли...

Добавлено через 1 минуту
Сообщение от poss
Какая своя собственная система андроид?
запиленная производителем под конкретный девайс... miui, к примеру, слыхали?
Вопрос: Android + usb web camera

ребят помогите есть андроид 6,0 . отг кабель и юсб веб камера всё пробовал немогу подключить камеру ненаходит андроид а флешку юсб сразу обнаружывает
Ответ:
Сообщение от serjuccc
ребят помогите есть андроид 6,0 . отг кабель и юсб веб камера всё пробовал немогу подключить камеру ненаходит андроид а флешку юсб сразу обнаружывает
попробуйте поискать на этом сайте:
[cut]
Вопрос: Где хранятся файлы с БД SQLite в Android Studio?

Такая проблема, создал БД, создал колонки с именами, но потом начал переименовывать и ошибка (код ниже). Пишет не создано колонки с именем, как я понял. Создал новый проект, там программа запускается и выполняет все операции. Скажите, могу я удалить какой-то файл (или часть файла), чтобы таблица создавалась всегда заного (после моего удаления). Класс DBHelper прописан в МейнАктивити.
Кликните здесь для просмотра всего текста
Код ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
04-06 14:56:02.785    1843-1843/ru.site.myapplication33 E/SQLiteLog﹕ (1) table mytable has no column named family
04-06 14:56:02.786    1843-1843/ru.site.myapplication33 E/SQLiteDatabase﹕ Error inserting name=1 family=1
    android.database.sqlite.SQLiteException: table mytable has no column named family (code 1): , while compiling: INSERT INTO mytable(name,family) VALUES (?,?)
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
            at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
            at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
            at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
            at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
            at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
            at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)
            at ru.site.myapplication33.RedactStudentov.onClick(RedactStudentov.java:74)
            at android.view.View.performClick(View.java:4756)
            at android.view.View$PerformClick.run(View.java:19749)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
04-06 14:56:02.786    1843-1843/ru.site.myapplication33 D/myLogs﹕ row inserted, ID = -1
device not found
Ответ: liroykaz, БД в Android Studio предпочтительно хранить в папке assets/ (некоторые по старинке хранят ещё и в assets/databases/). После начала работы программы БД копируется в папку data/имя_пакета/ (как сам настроишь).
Если вам нужны старые данные пользователя перед изменением БД, лучше сначала сделать временную таблицу, а потом уже удалять старую. Если старые данные не нужны, проще удалить БД и скопировать заново, но тут тонкий момент, некоторые смартфоны могут глючить.
Вопрос: Неубиваемый Service Android

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

AndroidManifest.xml:

Кликните здесь для просмотра всего текста

XML
1
2
3
4
5
6
7
8
9
10
11
 <service
        android:name=".NotificationService"
        android:enabled="true"
        android:exported="true"
        android:process=":AlarmBattery"/>
 
    <receiver android:name="ardel.batteryalarm.BootReceiver">
        <intent-filter>
            <action android:name = "android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>



BootReceiver.java
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
public class BootReceiver extends BroadcastReceiver {
public BootReceiver() {}
 
@Override
public void onReceive(Context context, Intent intent) {
    Intent serviceIntent = new Intent(context, NotificationService.class);
    context.startService(serviceIntent);
}
}


MainActivity.java(основная часть кода):
Кликните здесь для просмотра всего текста

Java
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
protected void onCreate(Bundle savedInstanceState) {
 
    intentService = new Intent(this,NotificationService.class);
    registerReceiver(this.mBatInfoReceiver, new    IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}
 
private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context c, Intent intent) {
        int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
        if (level <= 50) {
            notification(level);
        }
        int voltage = intent.getIntExtra("voltage", 0);
        int temperature = intent.getIntExtra("temperature", 0);
        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                status == BatteryManager.BATTERY_STATUS_FULL;
        batteryLevel.setText("Battery Status: " + String.valueOf(level) + "% " + isCharging);
        voltageLevel.setText("Battery Voltage: " + String.valueOf(voltage));
        double temps = (double)temperature / 10;
        temperatureLevel.setText("Battery Temperature: " + String.valueOf(temps));
 
    }
};
 
private void notification(int level) {
        startService(intentService);
}
 
@Override
    protected void onStop()
    {
        unregisterReceiver(mBatInfoReceiver);
        super.onStop();
    }


NotificationService.java:
Кликните здесь для просмотра всего текста

Java
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
public class NotificationService extends Service {
NotificationManager manager;
private static final int NOTIFY_ID = 101;
 
@Override
public void onCreate() {
    super.onCreate();
    manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    setNotification();
 
}
 
private void setNotification() {
    Context context = getApplicationContext();
 
    Intent notificationIntent = new Intent(context, MainActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(context,
            0, notificationIntent,
            PendingIntent.FLAG_CANCEL_CURRENT);
 
    Resources res = context.getResources();
    Notification.Builder builder = new Notification.Builder(context);
 
    builder.setContentIntent(contentIntent)
            .setSmallIcon(R.drawable.battery)  
            .setTicker("Msg")
            .setWhen(System.currentTimeMillis())
            .setAutoCancel(true)
 
            .setContentTitle("Msg1")
 
            .setContentText("Msg2а");
 
    Notification notification = builder.build();
 
    NotificationManager notificationManager = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(NOTIFY_ID, notification);
}
 
public IBinder onBind(Intent arg0) {
    return null;
}
}


Буду очень-очень благодарен любой помощи
Ответ: логика есть в том что вы говорите. покажите ваш сервис класс, посмотрим что можно сделать

Добавлено через 4 минуты
поискал в стаковерфлоу, предлагают добавить вот такой ресивер, не знаю будет ли работать, попробуйте:

XML
1
2
3
4
5
6
<receiver android:name=".receivers.onRestartReciever">
        <intent-filter>
            <action android:name="android.intent.action.PACKAGE_REPLACED" />
            <action android:name="android.intent.action.PACKAGE_RESTARTED" />
            <data android:scheme="package" android:path="my.Package.Path" />
        </intent-filter>
Java
1
2
3
4
5
6
7
8
public class onRestartReciever extends BroadcastReceiver {
 
@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
// тут старт сервис
    }
}
Вопрос: Авторизация Android ошибки

Крашится приложение после того, как я нажимаю кнопку войти в LoginActivity, в этом деле я новичек и делал всё руководствуюсь статьями из сети. В чем причина краша?

LoginActivity
Кликните здесь для просмотра всего текста
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
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
 
import java.util.ArrayList;
import java.util.List;
 
public class Login extends Activity {
 
    public static String URL_LOGIN = "localhost/Auth.php";
 
    EditText etLogin;
    EditText etPassword;
    Button btnLogin;
    List<NameValuePair> params;
    SharedPreferences sharedPreferences;
    ServerRequest serverRequest;
 
 
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
 
        serverRequest = new ServerRequest();
 
        etLogin = (EditText) findViewById(R.id.etLogin);
        etPassword = (EditText) findViewById(R.id.etPassword);
 
        btnLogin = (Button) findViewById(R.id.btnLogin);
 
        btnLogin.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View v) {
 
                String email = etLogin.getText().toString();
                String password = etPassword.getText().toString();
                params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("email", email));
                params.add(new BasicNameValuePair("password", password));
                ServerRequest serverRequest = new ServerRequest();
                JSONObject jsonObject = serverRequest.getJSON(URL_LOGIN);
                if(jsonObject != null) {
 
                    try {
 
                        String jsonstr = jsonObject.getString("response");
                        if (jsonObject.getBoolean("res")){
                            String token = jsonObject.getString("token");
                            SharedPreferences.Editor editor = sharedPreferences.edit();
                            editor.putString("token", token);
                            editor.apply();
                            Intent intent = new Intent(Login.this,Main.class);
                            startActivity(intent);
                            finish();
                        }
 
                        Toast.makeText(getApplication(),jsonstr,Toast.LENGTH_LONG).show();
 
                    }
 
                    catch (JSONException e) {
 
                        e.printStackTrace();
 
                    }
                }
 
            }
 
        });
 
    }
 
}


ServerRequest
Кликните здесь для просмотра всего текста
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
import android.os.AsyncTask;
import android.util.Log;
 
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.concurrent.ExecutionException;
 
public class ServerRequest {
 
    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";
    List<NameValuePair> params;
 
 
    public ServerRequest() {
 
    }
 
    public JSONObject getJSONFromUrl(String url, List<NameValuePair> params) {
 
 
        try {
 
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params));
 
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
 
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line).append("n");
            }
            is.close();
            json = sb.toString();
            Log.e("JSON", json);
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
 
 
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }
 
 
        return jObj;
 
    }
    JSONObject jobj;
    public JSONObject getJSON(String url) {
 
        Params param = new Params(url,params);
        Request myTask = new Request();
        try{
            jobj= myTask.execute(param).get();
        }catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        return jobj;
    }
 
 
    private static class Params {
        String url;
        List<NameValuePair> params;
 
 
        Params(String url, List<NameValuePair> params) {
            this.url = url;
            this.params = params;
 
        }
    }
 
    private class Request extends AsyncTask<Params, String, JSONObject> {
 
        @Override
        protected JSONObject doInBackground(Params... args) {
 
            ServerRequest request = new ServerRequest();
 
            return request.getJSONFromUrl(args[0].url,args[0].params);
        }
 
        @Override
        protected void onPostExecute(JSONObject json) {
 
            super.onPostExecute(json);
 
        }
 
    }
}


Log

Кликните здесь для просмотра всего текста
Code
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
04-09 18:28:19.189 16849-16849/? I/art: Late-enabling -Xcheck:jni
04-09 18:28:19.661 16849-16885/com.dpa7dujijiepgmail.app I/OpenGLRenderer: Initialized EGL, version 1.4
04-09 18:28:19.661 16849-16885/com.dpa7dujijiepgmail.app W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
04-09 18:28:27.198 16849-16849/com.dpa7dujijiepgmail.app W/IInputConnectionWrapper: beginBatchEdit on inactive InputConnection
04-09 18:28:27.198 16849-16849/com.dpa7dujijiepgmail.app W/IInputConnectionWrapper: endBatchEdit on inactive InputConnection
04-09 18:28:30.577 16849-16849/com.dpa7dujijiepgmail.app W/System.err: java.util.concurrent.ExecutionException: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
04-09 18:28:30.580 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at java.util.concurrent.FutureTask.report(FutureTask.java:93)
04-09 18:28:30.580 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at java.util.concurrent.FutureTask.get(FutureTask.java:163)
04-09 18:28:30.580 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at android.os.AsyncTask.get(AsyncTask.java:483)
04-09 18:28:30.580 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at com.dpa7dujijiepgmail.diplom.ServerRequest.getJSON(ServerRequest.java:83)
04-09 18:28:30.580 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at com.dpa7dujijiepgmail.diplom.Login$1.onClick(Login.java:56)
04-09 18:28:30.580 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at android.view.View.performClick(View.java:4756)
04-09 18:28:30.580 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at android.view.View$PerformClick.run(View.java:19761)
04-09 18:28:30.580 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
04-09 18:28:30.580 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
04-09 18:28:30.580 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at android.os.Looper.loop(Looper.java:135)
04-09 18:28:30.580 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5253)
04-09 18:28:30.580 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
04-09 18:28:30.580 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
04-09 18:28:30.580 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:949)
04-09 18:28:30.581 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:744)
04-09 18:28:30.581 16849-16849/com.dpa7dujijiepgmail.app W/System.err: Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
04-09 18:28:30.583 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at org.apache.http.client.utils.URLEncodedUtils.format(URLEncodedUtils.java:160)
04-09 18:28:30.583 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at org.apache.http.client.entity.UrlEncodedFormEntity.<init>(UrlEncodedFormEntity.java:71)
04-09 18:28:30.583 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at com.dpa7dujijiepgmail.diplom.ServerRequest.getJSONFromUrl(ServerRequest.java:41)
04-09 18:28:30.583 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at com.dpa7dujijiepgmail.diplom.ServerRequest$Request.doInBackground(ServerRequest.java:110)
04-09 18:28:30.583 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at com.dpa7dujijiepgmail.diplom.ServerRequest$Request.doInBackground(ServerRequest.java:103)
04-09 18:28:30.583 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:288)
04-09 18:28:30.583 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
04-09 18:28:30.583 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
04-09 18:28:30.583 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
04-09 18:28:30.583 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
04-09 18:28:30.583 16849-16849/com.dpa7dujijiepgmail.app W/System.err:     at java.lang.Thread.run(Thread.java:818)
04-09 18:28:30.585 16849-16983/com.dpa7dujijiepgmail.app E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #5
                                                                              Process: com.dpa7dujijiepgmail.app, PID: 16849
                                                                              java.lang.RuntimeException: An error occured while executing doInBackground()
                                                                                  at android.os.AsyncTask$3.done(AsyncTask.java:300)
                                                                                  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                                                                                  at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                                                                                  at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                                                                                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                                  at java.lang.Thread.run(Thread.java:818)
                                                                               Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
                                                                                  at org.apache.http.client.utils.URLEncodedUtils.format(URLEncodedUtils.java:160)
                                                                                  at org.apache.http.client.entity.UrlEncodedFormEntity.<init>(UrlEncodedFormEntity.java:71)
                                                                                  at com.dpa7dujijiepgmail.app.ServerRequest.getJSONFromUrl(ServerRequest.java:41)
                                                                                  at com.dpa7dujijiepgmail.app.ServerRequest$Request.doInBackground(ServerRequest.java:110)
                                                                                  at com.dpa7dujijiepgmail.app.ServerRequest$Request.doInBackground(ServerRequest.java:103)
                                                                                  at android.os.AsyncTask$2.call(AsyncTask.java:288)
                                                                                  at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)*
                                                                                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)*
                                                                                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)*
                                                                                  at java.lang.Thread.run(Thread.java:818)*
04-09 18:31:29.992 16849-16849/com.dpa7dujijiepgmail.app W/IInputConnectionWrapper: beginBatchEdit on inactive InputConnection
04-09 18:31:29.993 16849-16849/com.dpa7dujijiepgmail.app W/IInputConnectionWrapper: finishComposingText on inactive InputConnection
04-09 18:31:29.993 16849-16849/com.dpa7dujijiepgmail.app W/IInputConnectionWrapper: endBatchEdit on inactive InputConnection
Ответ:
Сообщение от YuraAAA
params null
Да, действительно немного подредактировал и всё встало на свои места. Но теперь я столкнулся с другой проблемой, при попытке авторизоваться, запрос доходит до сервера и возвращается токен (это видно в логе), но далее идут непонятные мне ошибки.

Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
04-10 10:09:43.469 1086-1305/com.dpa7dujijiepgmail.diplom E/JSON: {"status":"OK","token":"6839f91efb7e0061847edab095eae5105704268021cd2be5018b4567"}n
04-10 10:09:43.473 1086-1086/com.dpa7dujijiepgmail.app W/System.err: org.json.JSONException: No value for response
04-10 10:09:43.497 1086-1086/com.dpa7dujijiepgmail.app W/System.err:     at org.json.JSONObject.get(JSONObject.java:354)
04-10 10:09:43.497 1086-1086/com.dpa7dujijiepgmail.app W/System.err:     at org.json.JSONObject.getString(JSONObject.java:510)
04-10 10:09:43.497 1086-1086/com.dpa7dujijiepgmail.app W/System.err:     at com.dpa7dujijiepgmail.app.Login$1.onClick(Login.java:61)
04-10 10:09:43.497 1086-1086/com.dpa7dujijiepgmail.app W/System.err:     at android.view.View.performClick(View.java:4084)
04-10 10:09:43.497 1086-1086/com.dpa7dujijiepgmail.app W/System.err:     at android.view.View$PerformClick.run(View.java:16966)
04-10 10:09:43.497 1086-1086/com.dpa7dujijiepgmail.app W/System.err:     at android.os.Handler.handleCallback(Handler.java:615)
04-10 10:09:43.497 1086-1086/com.dpa7dujijiepgmail.app W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:92)
04-10 10:09:43.497 1086-1086/com.dpa7dujijiepgmail.app W/System.err:     at android.os.Looper.loop(Looper.java:137)
04-10 10:09:43.497 1086-1086/com.dpa7dujijiepgmail.app W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:4745)
04-10 10:09:43.497 1086-1086/com.dpa7dujijiepgmail.app W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
04-10 10:09:43.497 1086-1086/com.dpa7dujijiepgmail.app W/System.err:     at java.lang.reflect.Method.invoke(Method.java:511)
04-10 10:09:43.497 1086-1086/com.dpa7dujijiepgmail.app W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
04-10 10:09:43.497 1086-1086/com.dpa7dujijiepgmail.app W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
04-10 10:09:43.497 1086-1086/com.dpa7dujijiepgmail.app W/System.err:     at dalvik.system.NativeStart.main(Native Method)


Добавлено через 9 часов 6 минут
Сообщение от Dpa7DuJIJIep
Да, действительно немного подредактировал и всё встало на свои места. Но теперь я столкнулся с другой проблемой, при попытке авторизоваться, запрос доходит до сервера и возвращается токен (это видно в логе), но далее идут непонятные мне ошибки.
Ошибку я нашел. Спасибо YuraAAA за ответ на предыдущий вопрос.
Вопрос: Клиент Android не коннектится к Серверу пк

Клиент Android не коннектится к Серверу ПК.

Сервер:
Java
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
import java.io.*;
import java.net.*;
 
public class Server {
 
    public static void main(String[] args) throws IOException {
        System.out.println("Welcome to Server side");
        BufferedReader in = null;
        PrintWriter    out= null;
 
        ServerSocket servers = null;
        Socket       fromclient = null;
        Socket       fromclient2 = null;
 
        // create server socket
        try {
            servers = new ServerSocket(4444);
        } catch (IOException e) {
            System.out.println("Couldn't listen to port 4444");
            System.exit(-1);
        }
 
        try {
            System.out.print("Waiting for a 1 client...");
            fromclient = servers.accept();
            System.out.println("Client connected");
            System.out.print("Waiting for a 2 client...");
            fromclient2 = servers.accept();
            System.out.println("Client connected");
        } catch (IOException e) {
            System.out.println("Can't accept");
            System.exit(-1);
        }
 
        in  = new BufferedReader(new
                InputStreamReader(fromclient.getInputStream()));
        out = new PrintWriter(fromclient2.getOutputStream(),true);
        String         input,output;
 
        System.out.println("Wait for messages");
        while ((input = in.readLine()) != null) {
            if (input.equalsIgnoreCase("exit")) break;
            out.println("S ::: "+input);
            System.out.println(input);
        }
        out.close();
        in.close();
        fromclient.close();
        servers.close();
    }
}
Клиент:
Java
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
package vershiloandrey.clientandroid;
 
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
 
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
 
public class MainActivity extends AppCompatActivity implements Runnable{
 
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See [url]https://g.co/AppIndexing/AndroidStudio[/url] for more information.
     */
    private GoogleApiClient client;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.activity_main);
 
        final Button[] buttonArray = {
                (Button) findViewById(R.id.button1),
                (Button) findViewById(R.id.button2),
                (Button) findViewById(R.id.button3),
                (Button) findViewById(R.id.button4),
                (Button) findViewById(R.id.button5),
                (Button) findViewById(R.id.button6),
                (Button) findViewById(R.id.button7)
        };
 
        int i = 0;
        final int ifinal = i;
        buttonArray[i].setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                buttonArray[ifinal].setText("o");
                try {
                    connecting();
                }catch(IOException e){
 
                }
            }
        });
 
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See [url]https://g.co/AppIndexing/AndroidStudio[/url] for more information.
        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
    }
 
    public void connecting() throws IOException {
 
        //System.out.println("Welcome to Client side");
        run();
    }
 
    @Override
    public void onStart() {
        super.onStart();
 
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See [url]https://g.co/AppIndexing/AndroidStudio[/url] for more information.
        client.connect();
        Action viewAction = Action.newAction(
                Action.TYPE_VIEW, // TODO: choose an action type.
                "Main Page", // TODO: Define a title for the content shown.
                // TODO: If you have web page content that matches this app activity's content,
                // make sure this auto-generated web page URL is correct.
                // Otherwise, set the URL to null.
                Uri.parse("http://host/path"),
                // TODO: Make sure this auto-generated app URL is correct.
                Uri.parse("android-app://vershiloandrey.clientandroid/http/host/path")
        );
        AppIndex.AppIndexApi.start(client, viewAction);
    }
 
    @Override
    public void onStop() {
        super.onStop();
 
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See [url]https://g.co/AppIndexing/AndroidStudio[/url] for more information.
        Action viewAction = Action.newAction(
                Action.TYPE_VIEW, // TODO: choose an action type.
                "Main Page", // TODO: Define a title for the content shown.
                // TODO: If you have web page content that matches this app activity's content,
                // make sure this auto-generated web page URL is correct.
                // Otherwise, set the URL to null.
                Uri.parse("http://host/path"),
                // TODO: Make sure this auto-generated app URL is correct.
                Uri.parse("android-app://vershiloandrey.clientandroid/http/host/path")
        );
        AppIndex.AppIndexApi.end(client, viewAction);
        client.disconnect();
    }
 
    public void run(){
        try {
            Socket fromserver = null;
            fromserver = new Socket("192.168.0.104", 4444);
            BufferedReader in = new BufferedReader(new InputStreamReader(fromserver.getInputStream()));
            PrintWriter out = new PrintWriter(fromserver.getOutputStream(), true);
            BufferedReader inu;
            inu = new BufferedReader(new InputStreamReader(System.in));
 
            String fuser, fserver;
 
            while ((fuser = inu.readLine()) != null) {
                out.println(fuser);
                fserver = in.readLine();
                System.out.println(fserver);
                if (fuser.equalsIgnoreCase("close")) break;
                if (fuser.equalsIgnoreCase("exit")) break;
            }
 
            out.close();
            in.close();
            inu.close();
            fromserver.close();
        }catch(IOException e){
            System.out.println("rtr");
        }
    }
}
В AndroidManifest вписал только эту строчку
Java
1
<uses-permission  android:name = "android.permission.INTERNET"  />
У меня не получается приконнектится к серверу с клиента. Похоже, дело в адресе... Но после строки
Java
1
  fromserver = new Socket("192.168.0.104", 4444);
fromsetver = null и программа завершается...
Ответ: Паблито,

манифест
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
33
34
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="vershiloandrey.clientandroid" >
 
    <uses-permission  android:name = "android.permission."  />
    <uses-permission  android:name = "android.permission.ACCESS_FINE_LOCATION"  />
    <uses-permission  android:name = "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"  />
    <uses-permission  android:name = "android.permission.ACCESS_COARSE_LOCATION"  />
    <uses-permission  android:name = "com.example.towntour.permission.MAPS_RECEIVE"  />
    <uses-permission  android:name = "android.permission.ACCESS_NETWORK_STATE"  />
    <uses-permission  android:name = "android.permission.CALL_PHONE"  />
    <uses-permission  android:name = "android.permission.READ_PHONE_STATE"  />
    <uses-permission  android:name = "com.google.android.providers.gsf.permission.READ_GSERVICES"  />
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity><!-- ATTENTION: This was auto-generated to add Google Play services to your project for
     App Indexing.  See [url]https://g.co/AppIndexing/AndroidStudio[/url] for more information. -->
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
    </application>
 
</manifest>
А ошибки нет, клиент вроде коннектится, но сервер не видит его...
Вопрос: Таймер, AlarmManager и Service на Android

Добрый вечер.
Я уже создавал тем(ы) про таймер. И мне очень здорово помогли разобраться с Андроидом, особенно OlegJV, powowstal. Собственно, нижеприведенный код отчасти будет состоять из их примеров. Так как с Андроидом познакомился относительно недавно (чуть больше недели), мне сложно довести самому дело до конца.

Я хочу сделать свой первый таймер, который бы отсчитывал время в обратную сторону. В коде, который приведу, это CountDownTimer с AlarmManager. Почему с AlarmManager? Благодаря OlegJV, я выяснил, что таймер довольно потребная вещь, а мне бы желательно, чтобы он, мой таймер, работал на длительные промежутки и при отключении экрана (выхода из приложения), таймер (а вернее AlarmManager) продолжал бы свою работу, но сам CountDownTimer останавливался бы, чтобы не расходовать мне мою батарею. Узнал, что для такой задачи существуют сервисы, отчаянно пытался вкурить как они работают, но не смог. Слишком много всего и даже не знаю за что и как ухватиться. И тем более как реализовать.

Также, есть проблема с кнопками "+" и "-" - они отвечают за добавление и вычитание времени к основному таймеру. Есть одна особенность кнопки, отвечающей за добавление. При нажатии должен включиться новый таймер (неосновной), тикающий в прямом порядке, должно добавляться значение из TextView к значению CountDownTimer-а, и новом нажатии "+" добавление по прежнему должно быть, а неосновной таймер бы обнулялся.
При нажатии "-" должно происходить только вычитание.

Кое-как реализовал, но очень криво. Неправильно все работает.
К тому же надо как-то придумать, чтобы все таймеры не обнулялись при сворачивании, при длительной неактивности приложения, или чтобы сама система не позакрывала приложение из-за нехватки памяти.

activity_main.xml
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
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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.gmail.test.myapplication.MainActivity"
    android:transitionGroup="false">
    <!--  -->
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="START"
        android:id="@+id/startBtn"
        android:layout_centerInParent="true"
        android:nestedScrollingEnabled="true"
        android:visibility="visible" />
 
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/timeView"
        android:gravity="center"
        android:textSize="60sp"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="55dp"
        android:typeface="monospace" />
 
    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="+"
        android:id="@+id/addTimeBtn"
        android:layout_above="@+id/startBtn"
        android:layout_toLeftOf="@+id/startBtn"
        android:layout_toStartOf="@+id/startBtn"
        android:visibility="invisible"
        android:textAlignment="center" />
 
    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="-"
        android:id="@+id/subtractTimeBtn"
        android:layout_above="@+id/startBtn"
        android:layout_toRightOf="@+id/startBtn"
        android:layout_toEndOf="@+id/startBtn"
        android:visibility="invisible"
        android:textAlignment="center" />
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/timeUpView"
        android:layout_alignTop="@+id/subtractTimeBtn"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="13dp"
        android:width="60dp" />
 
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:ems="10"
        android:id="@+id/addTimeEdit"
        android:layout_alignBottom="@+id/addTimeBtn"
        android:layout_toLeftOf="@+id/addTimeBtn"
        android:layout_toStartOf="@+id/addTimeBtn"
        android:visibility="invisible"
        android:textAlignment="center" />
 
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:ems="10"
        android:id="@+id/subtractTimeEdit"
        android:layout_above="@+id/startBtn"
        android:layout_toRightOf="@+id/subtractTimeBtn"
        android:layout_toEndOf="@+id/subtractTimeBtn"
        android:visibility="invisible"
        android:textAlignment="center" />
 
</RelativeLayout>
Main Activity
Java
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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
package com.noob.wissen.timerapp;
 
import android.annotation.TargetApi;
import android.app.AlarmManager;
import android.content.Context;
import android.content.pm.ActivityInfo;
import java.util.Calendar;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
 
 
import java.util.Timer;
import java.util.TimerTask;
 
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 
    private Button startBtn;
    private Button addTimeBtn;
    private Button subtractTimeBtn;
    //
    private TextView timeView;
    private TextView timeUpView;
    //
    private EditText addTimeEdit;
    private EditText subtractTimeEdit;
 
    //private Timer timer;
    private Timer timerUp;
 
    private int countdown = 1200;
    private boolean timerIsStarted;
    private int countup = 0;
    AlarmManager manager;
    Long preTime;
    Long postTime;
    Long delay;
    CountDownTimer timer;
    Calendar calendar;
 
 
    @TargetApi(Build.VERSION_CODES.N)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Находим элементы на разметке
        startBtn = (Button) findViewById(R.id.startBtn);
        addTimeBtn = (Button) findViewById(R.id.addTimeBtn);
        subtractTimeBtn = (Button) findViewById(R.id.subtractTimeBtn);
        //
        timeView = (TextView) findViewById(R.id.timeView);
        timeUpView = (TextView) findViewById(R.id.timeUpView);
        //
        addTimeEdit = (EditText) findViewById(R.id.addTimeEdit);
        subtractTimeEdit = (EditText) findViewById(R.id.subtractTimeEdit);
        // Назначаем слушатель для кнопок
        startBtn.setOnClickListener(this);
        addTimeBtn.setOnClickListener(this);
        subtractTimeBtn.setOnClickListener(this);
        //
        addTimeEdit.setText("0");
        subtractTimeEdit.setText("0");
        //
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
 
        calendar = Calendar.getInstance();
        preTime = calendar.getTimeInMillis();
        calendar.add(Calendar.MINUTE, 5);
        postTime = calendar.getTimeInMillis();
        delay = postTime - preTime;
        manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        manager.set(AlarmManager.RTC_WAKEUP, postTime, null);
 
 
    }
 
    @Override
    public void onClick(View view) {
        if (view == startBtn) {
            timerIsStarted = !timerIsStarted;
            startTimer(timerIsStarted);
            startBtn.setVisibility(View.VISIBLE);
            addTimeBtn.setVisibility(View.VISIBLE);
            subtractTimeBtn.setVisibility(View.VISIBLE);
            addTimeEdit.setVisibility(View.VISIBLE);
            subtractTimeEdit.setVisibility(View.VISIBLE);
        }
        else if (view == addTimeBtn) {
            timerIsStarted = !timerIsStarted;
            addTime(timerIsStarted);
        }
        else if (view == subtractTimeBtn) {
            timerIsStarted = !timerIsStarted;
            subtractTime(timerIsStarted);
        }
    }
 
    @TargetApi(Build.VERSION_CODES.N)
    private void startTimer(boolean started) {
        if (started) {
            CountDownTimer timer = new CountDownTimer(delay, 1) {
                @Override
                public void onTick(long millisUntilFinished) {
                    final int seconds = (int)(millisUntilFinished / 1000) % 60;
                    final int minutes = (int)(millisUntilFinished / (1000 * 60)) % 60;
                    final int hours = (int)(millisUntilFinished / (1000 * 3600)) % 60;
 
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            timeView.setText(String.format("%02d:%02d:%02d", hours,
                                    minutes, seconds));
                        }
                    });
                }
 
                @Override
                public void onFinish() {
 
                }
            };
            timer.start();
        }
        //timer = new Timer();
        //timer.schedule(new TimerTask() {
        // @Override
        //public void run() {
        //h.sendEmptyMessage(1);
        // нюанс: таймер запускается в отдельном потоке
        // из него нет доступа к элементам интерфейса, в т.ч. к TextView
        // поэтому используем класс Handler, посылая в него сообщение, в данном случае "1",
        // цифра с потолка, можно любую
        // }
        //}, 0, 1000);
 
        else {
            if (timer != null) {
                try {
                    timer.cancel();
                }
                catch (Exception e) {
                }
            }
        }
    }
 
    private void addTime (boolean started) {
        if (started) {
            timerUp = new Timer();
            timerUp.schedule(new TimerTask() {
                @Override
                public void run() {
                    h.sendEmptyMessage(2);
                }
            }, 0, 1000);
        }
        else {
            if (timer != null) {
                try {
                    timer.cancel();
                }
                catch (Exception e) {
                }
            }//end if
        }
    }//end addTime()
 
    private void subtractTime (boolean started) {
        if (started) {
 
            h.sendEmptyMessage(3);
 
        }
        else {
            if (timer != null) {
                try {
                    timer.cancel();
                }
                catch (Exception e) {
                }
            }
        }
    }
    //Полагаю, что здесь реализовано неверно. При нажатии кнопки "+" или "-"
    //возникает откровенная дичь. Все не то, что не работает, но и ломает основный таймер в timeView.
    //В java-коде там, где был swing.timer, находился обработчик события TimerTick, куда можно было занести
    //countdown--. А арифметические операции были вынесены в отдельный обработчик соответствующих кнопок.
    Handler h = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
                //case 1: // если получили сообщение с нашей цифрой (сообщения могут быть из разных источников)
                    //countdown--;
                    //timeView.setText(String.format("%02d:%02d:%02d", countdown/3600,
                            //countdown/60%60, countdown%60)); // из Handler есть доступ к TextView
                    //break;
                case 2:
                    countup++;
                    timeUpView.setText(String.format("%02d:%02d:%02d", countup/3600,
                            countup/60%60, countup%60));
                    int addcountdown = Integer.parseInt(addTimeEdit.getText().toString());
                    delay += 60 * addcountdown;
                    //countup = 0;
                case 3:
                    int subtractcountdown = Integer.parseInt(subtractTimeEdit.getText().toString());
                    countdown -= 60 * subtractcountdown;
 
            }
        };
    };
}
Ответ:
какой в этом физический смысл? Показывать время с прошлого нажатия именно увеличения времени?
Да, именно так. Чтобы показывать время с прошлого нажатия кнопки увеличения времени. Например, есть аукцион. Идет время - до конца закрытия осталось - 5 мин. Тут появился желающий поднять ставку. Нажимаем "+". Добавляется время и обнуляется неосновной счетчик, время которого можно будет в дальнейшем уже сохранить.

Добавлено через 22 часа 35 минут
Что мне делать, не подскажете?
Пытался вывести обработчик добавления отдельно, т.е. добавлял слушателя что-то вроде этого:

Java
1
2
3
4
5
6
7
8
9
View.OnClickListener addTimeBtnListener = new View.OnClickListener() {
        @Override
        public void onClick (View v) {
            int addcountdown = Integer.parseInt(addTimeEdit.getText().toString());
            countup = 0;
            writeTime(addcountdown);
            startTimer(timerIsStarted);
        }
    };
Во writeTimer'е у меня как раз создается календарь и будильник. Хотя, наверное, это неправильно, так как будильник заново пересоздается. А нужно всего лишь добавить к нему другое время. Но даже так, после добавления секунды с CountDownTimer'а начинают вести себя неадекватно. Я не знаю почему.