Задать вопрос
Ответы пользователя по тегу Android
  • Почему не работает FirebaseInstanceIdService в Release Mode?

    @razer89
    Android-разработчик
    Вероятно, в консоли Firebase вы зарегистрировали только debug ключ. Добавьте также и релизный. Та же проблема возникает, если используете разные имена пакетов для сборок. Регистрировать нужно все пакеты.
    Ответ написан
  • Как работает socket.io на андроиде?

    @razer89
    Android-разработчик
    Соединение сокета оборвется тогда, когда ваше приложение будет убито системой. Сам по себе сокет предотвратить это убийство не может, Вам нужно реализовать это самому. Гуглите в сторону Android Service и startForeground (если требуется постоянная работа сервиса).
    P.S. Использование сокета в приложениях под мобильные устройства - на самом деле не лучшее решение. Постоянное подключение может вызвать увеличение расхода заряда аккумулятора, что в свою очередь вызовет косые взгляды со стороны пользователей. В качестве замены хорошо может подойти тот же GCM (или Firebase, как это рекомендует гугл).
    Ответ написан
  • В каких случаях использование Firebase оправдано?

    @razer89
    Android-разработчик
    Вы забыли упомянуть в минусах Firebase то, что он не бесплатен (при определенном количестве траффика). Если бюджет не критичен - используйте его, в будущем на его основе можете сделать кучу крутых штук. На счет лишнего функционала - почему это минус? Просто не используйте его. Наоборот, этот "лишний" функционал можно будет использовать в будущем, скажем, при внедрении новых фич.

    Но, если же вам нужна только доставка сообщений, и вы на 100% уверены, что большего функционала не потребуется - используйте GCM. Он прост во внедрении и прекрасно справляется со своими задачами.
    Ответ написан
  • Почему этот код работает?

    @razer89
    Android-разработчик
    Нельзя самому создавать инстанс сервиса! Оставьте эту работу системе!
    Удалите конструктор из сервиса, он вообще не нужен. Сервис и без вас получит контекст. Запускайте сервис из активити методом startService(Intent), а в самом сервисе переопределите onStartCommand, в котором собираетесь выполнять работу
    Ответ написан
    Комментировать
  • Как убрать кнопки с Диалогового окна?

    @razer89
    Android-разработчик
    Из документации к библиотеке:
    DatePickerDialog autoDismiss(boolean autoDismiss) If set to true will dismiss the picker when the user selects a date. This defaults to false

    Попробуйте установить этот параметр в true. Не факт, что кнопки пропадут, но диалог должен начать скрываться после выбора даты
    Ответ написан
  • Почему xml для android такой ужасный на вид и есть ли альтернативы?

    @razer89
    Android-разработчик
    Вполне себе нормальный xml, к нему достаточно быстро привыкаешь. Достойных альтернатив не встречал. На счет layout в названии - это означает, что атрибут будет применен к родительскому контейнеру (если это возможно). К примеру, gravity="right" - означает, что контейнер будет выравнивать свое содержимое по правому краю, layout_gravity же попытается выровнять сам контейнер в родительском элементе
    Ответ написан
    2 комментария
  • Ошибка в приложении must implement onSomeEventListener? Что не так?

    @razer89
    Android-разработчик
    Судя по логам, ваш MainActivity должен реализовывать интерфейс APIS, что скорее всего не так. Добавьте в MainActivity implements APIS, и реализуйте методы этого интерфейса
    Ответ написан
  • Можно ли использовать 1 аккаунт для нескольких Android смартфонов?

    @razer89
    Android-разработчик
    Сможете, но подумайте о том, нужна ли вам активность вашего аккаунта от лица другого человека?
    Ответ написан
    Комментировать
  • Как правльно использовать RecyclerView.Adapter в Android Studio?

    @razer89
    Android-разработчик
    Замените строку
    personViewHolder.personAge.setText(items.get(i).cell);

    на строку:
    personViewHolder.personAge.setText(String.valueOf(items.get(i).cell));
    Ответ написан
    2 комментария
  • (Все еще не решено)Сокет клиент. Как постоянно мониторить есть ли данные с серваера?

    @razer89
    Android-разработчик
    Сокет - очень ненадежная вещь, особенно при использовании мобильного интернета. Попробуйте взглянуть в сторону GCM, который гарантирует доставку сообщений и имеет хороший API-клиент для Android.
    Ответ написан
    Комментировать
  • Как реализовать управление сторонним музыкальным плеером через своё приложение на Android без рута?

    @razer89
    Android-разработчик
    KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PAUSE);
    Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON);
    intent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
    sendOrderedBroadcast(intent, null);
    
    keyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PAUSE);
    intent = new Intent(Intent.ACTION_MEDIA_BUTTON);
    intent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
    sendOrderedBroadcast(intent, null);
    Ответ написан
    Комментировать
  • Как можно получить фото города по названию или его координатам?

    @razer89
    Android-разработчик
    Не изобретайте велосипед, и не пытайтесь что-то парсить - это гиблое дело. Используйте API
    UPD:
    В рамках разработки под Android я бы все же рекомендовал вам использовать официальное API. Не совсем понимаю, что вас в нем не устраивает. Обратите внимание на следующий код:
    1. Инициализируем ApiClient:
    GoogleApiClient googleApiClient = new GoogleApiClient.Builder(service).addApi(Places.GEO_DATA_API).build();
    googleApiClient.connect();

    2. Инициализируем фильтр по городам:
    AutocompleteFilter filter = new AutocompleteFilter.Builder()
                    .setTypeFilter(AutocompleteFilter.TYPE_FILTER_CITIES)
                    .build();

    3. Получаем список (в моем случае - это AutocompletePrediction, вы можете пойти более удобным для вас путем):
    PendingResult<AutocompletePredictionBuffer> result = Places.GeoDataApi
                    .getAutocompletePredictions(googleApiClient, externalQuery, null, filter);
    AutocompletePredictionBuffer autocompletePredictions = result.await(60, TimeUnit.SECONDS);
    ArrayList<AutocompletePrediction> predictions = DataBufferUtils.freezeAndClose(autocompletePredictions);
    autocompletePredictions.release();

    Ну и собственно получаем список фото:
    PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi.getPlaceById(googleApiClient, prediction.getPlaceId());
    Places.GeoDataApi.getPlacePhotos(googleApiClient, prediction.getPlaceId());
    Ответ написан
  • Какой календарь можно использовать для следующей задачи?

    @razer89
    Android-разработчик
    Обратите внимание на эту библиотеку:
    Очень гибкая вещь в плане кастомизации внешнего вида. Например, мне потребовалось сделать вот так:
    18cdf46605f24f6f968541f05e58b5e0.png
    Ответ написан
    7 комментариев
  • Как обновить версию андроид?

    @razer89
    Android-разработчик
    Пока производитель вашего устройства не выпустит обновление - у вас ничего не получится. И системные требования здесь абсолютно не при чем, скорее важен интерес производителя к этому вопросу (но увы, уверен, он минимален). Как альтернатива - существуют "кастомные" неофициальные версии прошивок со всеми вытекающими, можно найти на тематических форумах.
    Ответ написан
    2 комментария
  • Чем пользуетесь вы?

    @razer89
    Android-разработчик
    Есть замечательный плагин для Android Studio - Android Drawable Importer
    Ответ написан
    1 комментарий
  • Подьем кнопок над клавиатурой?

    @razer89
    Android-разработчик
    Установите в AndroidManifest вашей активити флаг windowSoftInputMode="adjustResize" и посмотрите результат. Думаю, должно помочь.
    <activity android:name=".MainActivity"
                android:windowSoftInputMode="adjustResize">

    Скомпилил ваш xml у себя, слегка его модифицировав:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:ads="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:id="@+id/fragment_learn_words"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="96dp"
            android:layout_marginRight="2dp"
            android:layout_marginLeft="2dp"
            android:layout_marginTop="2dp"
            android:orientation="horizontal">
    
            <ImageView
            android:id="@+id/ivWord"
            android:layout_width="96dp"
            android:layout_height="match_parent"
            android:layout_gravity="center_vertical"
            android:layout_marginRight="0.5dp"
            android:gravity="center"
                android:src="@android:drawable/ic_dialog_dialer"
            android:scaleType="centerCrop" />
    
            <TextView
                android:id="@+id/tvWord"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center_horizontal"
                android:layout_marginLeft="0.5dp"
                android:background="?attr/colorPrimary"
                android:gravity="center"
                android:text="empty"
                android:textSize="35sp"
                android:textStyle="bold" />
        </LinearLayout>
    
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="1dp"
            android:layout_weight="0.4">
    
            <EditText
                android:id="@+id/etEnterWord"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginRight="2dp"
                android:layout_marginLeft="2dp"
                android:background="@android:color/darker_gray"
                android:gravity="center_horizontal"
                android:hint="etHintEnterWord"
                android:inputType="textNoSuggestions"
                android:maxLength="15"
                android:minLines="1"
                android:textSize="35sp"
                android:textStyle="bold" />
    
            <com.google.android.gms.ads.AdView
                android:id="@+id/adView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal|bottom"
                android:layout_marginTop="1dp"
                ads:adSize="BANNER"
                ads:adUnitId="123456">
            </com.google.android.gms.ads.AdView>
        </FrameLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginRight="2dp"
            android:layout_marginLeft="2dp"
            android:layout_margin="2dp"
            android:layout_marginTop="1dp"
            android:orientation="horizontal">
    
            <Button
                android:id="@+id/btnHelp"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginRight="0.5dp"
                android:layout_weight="1"
                android:background="?attr/colorPrimary"
                android:gravity="center"
                android:text="\?"
                android:textSize="30dp" />
    
            <Button
                android:id="@+id/btnCheck"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginRight="0.5dp"
                android:layout_weight="0.4"
                android:background="?attr/colorPrimary"
                android:gravity="center"
                android:text="Проверить"
                android:textSize="30dp" />
    
            <Button
                android:id="@+id/btnNextWord"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="?attr/colorPrimary"
                android:gravity="center"
                android:text="->"
                android:textSize="30dp" />
        </LinearLayout>
    </LinearLayout>

    Вот что получилось:
    26b278c1c09f45f6919960c0e9e67718.png2491a255a962443887cb44655254eb71.png
    Такого результата вы ожидаете?
    Ответ написан
    8 комментариев
  • Map fragment null pointer exception?

    @razer89
    Android-разработчик
    На этом этапе карта еще не готова. Для этого и существует метод onMapReady, в нем у вас гарантированно карта не будет равна null - используйте его. Если нужен доступ из других классов (что на мой взгляд очень некрасиво), можете реализовать свой listener, который будет срабатывать в методе onMapReady(), или сразу же, если карта уже доступна.

    public class MapFragmentOne extends Fragment implements OnMapReadyCallback,
            GoogleMap.OnMapClickListener {
        private static final int LAYOUT = R.layout.tab_one;
        private static View view;
        private static GoogleMap mMap;
        private SupportMapFragment mapFragment;
        private OnGetMap listener;
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            LayoutInflater lf = getActivity().getLayoutInflater();
            view = lf.inflate(LAYOUT, container, false);
    
            mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
            if (mapFragment == null) {
                FragmentManager fragmentManager = getFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                mapFragment = SupportMapFragment.newInstance();
                fragmentTransaction.replace(R.id.map, mapFragment).commit();
            }
            mapFragment.getMapAsync(this);
            return view;
        }
    
        @Override
        public void onMapReady(GoogleMap googleMap) {
            mMap = googleMap;
            // А вот здесь не null
            Log.d("MAP2", mMap + "");
            mMap.getUiSettings().setZoomControlsEnabled(true);
            mMap.setBuildingsEnabled(true);
            mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
            mMap.setIndoorEnabled(true);
            mMap.setOnMapClickListener(this);
            if (listener != null) {
                listener.onGetMap(mMap);
            }
        }
    
        @Override
        public void onMapClick(LatLng point) {
            if (mMap != null) {
                //Actions on clicks
            }
        }
    
        public void getMap(OnGetMap listener) {
            if (mMap != null) {
                listener.onGetMap(mMap);
            } else {
                this.listener = listener;
            }
        }
    
        public interface OnGetMap {
            void onGetMap(GoogleMap map);
        }
    }


    В другом классе получаем так:
    mapFragmentOne.getMap(new OnGetMap() {
                @Override
                public void onGetMap(GoogleMap map) {
                    // do something with map
                }
            });
    Ответ написан
    3 комментария
  • Как при запуске выводить нужный мне активити?

    @razer89
    Android-разработчик
    Сделайте стартовую активити, которая будет всегда запускаться первой и проверять в настройках, какая активити должна быть запущена, и запускать ее. Чтобы пользователю она была не видна, и чтобы вся работа этой активити была незаметной, можно применить ей такую тему:
    <style name="NoDisplay" parent="AppTheme">
            <item name="android:windowBackground">@null</item>
            <item name="android:windowContentOverlay">@null</item>
            <item name="android:windowIsTranslucent">true</item>
            <item name="android:windowAnimationStyle">@null</item>
            <item name="android:windowDisablePreview">true</item>
            <item name="android:windowNoDisplay">true</item>
        </style>
    Ответ написан
    Комментировать