Виджет для домашнего экрана с Ionic Cordova и Cordova-Plugin-Ace - PullRequest
1 голос
/ 20 апреля 2019

Я хочу отправить виджет с моим приложением Cordova. В настоящее время я просто использую стартовый проект Ionic 4 tabs и не изменил никаких данных на src. Я просто добавил туз-плагин и внес изменения в платформы и родную папку (описано внизу). Я делаю учебник по созданию виджета (https://www.codeproject.com/Tips/1218204/How-to-Create-an-Android-Application-Widget-using). Но после всего, что я пробовал, виджет не встречается в списке виджетов моего телефона.

Виджеты должны быть написаны на нативном коде, поэтому я добавил ace-plugin, который добавляет папку с именем «native». В этой папке может быть написан собственный код, который затем отправляется в папку платформы Cordova при сборке. Затем я последовал руководству сверху и добавил приемник и сервис для виджета на платформах Android Manifest и нативный (ace) Android Manifest. Манифест был единственным, я изменил в папке платформы. Все остальные изменения сделаны в родной папке плагина. Я предоставляю метаданные для виджета в папке res, добавляя list_widget_info.xml и добавляю макеты для виджетов списка, добавляя list_widget_item.xml и list_widget_layout.xml в папку макетов. Также я предоставил изображение в папке drawable. Как WidgetProvider я добавил ListWidgetProvider.java в папку src / io / ionic / starter. После сборки все, что находится в собственной папке, отправляется в папку платформ правильным образом.

AndroidMaifest.xml (между созданным действием и «Ace-Activity»

<receiver android:name="io.ionic.starter.ListWidgetProvider">
   <intent-filter>
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
   </intent-filter>
   <meta-data android:name="android.appwidget.provider" android:resource="@xml/list_widget_info"/>
</receiver>
<service android:exported="false" android:name="run.ace.AppWidgetService" android:permission="android.permission.BIND_REMOTEVIEWS" />

ListWidgetProvider.java

package io.ionic.starter;

public class ListWidgetProvider extends run.ace.AppWidgetProvider {

   @Override
   protected int getLayoutResourceId(android.content.Context context) {
     return run.ace.NativeHost.getResourceId("list_widget_layout", "layout", context);
   }

   @Override
   protected int getViewResourceId(android.content.Context context) {
     return run.ace.NativeHost.getResourceId("list_widget_view", "id", context);
   }

   @Override
   protected int getItemResourceId(android.content.Context context) {
     return run.ace.NativeHost.getResourceId("list_widget_item", "id", context);
   }

   @Override
   protected int getItemTextResourceId(android.content.Context context) {
     return run.ace.NativeHost.getResourceId("list_widget_item_text", "id", context);
   }

   @Override
   protected int getItemLayoutResourceId(android.content.Context context) {
     return run.ace.NativeHost.getResourceId("list_widget_item", "layout", context);
   }
}

list_widget_info.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:minWidth="250dp"
  android:minHeight="40dp"
  android:resizeMode="horizontal|vertical"
  android:updatePeriodMillis="86400000"
  android:previewImage="@drawable/list_widget_preview"
  android:initialLayout="@layout/list_widget_layout">
</appwidget-provider>

list_widget_item.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_widget_item"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  <TextView
    android:id="@+id/list_widget_item_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:textColor="#ffffff"
    android:textSize="40px" />
</FrameLayout>

list_widget_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_widget_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:loopViews="true" />

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

Мои вопросы:

  • есть ли у кого-то такая же проблема с помощью ace-plugin и знаете решение для отображения виджета в списке виджетов?
  • есть какая-то ошибка, я не видел, может в родном коде для создания виджета?
  • Правильный ли мой подход, эта ошибка должна зависеть от манифеста Android?
  • я могу показать манифест андроида где-нибудь после запуска моего приложения на телефоне?

Я рад каждому совету, которому могу следовать, чтобы решить эту проблему. Спасибо за помощь:)

1 Ответ

0 голосов
/ 05 мая 2019

Так что, по крайней мере, у меня есть некоторые улучшения. Я обнаружил, что мой проект на самом деле не использует AndroidManifest в папке platform / android, однако в платформе / android / app. Поэтому, если я вручную копирую все файлы, которые я предоставляю в Вопросе в папке приложения, это работает так, как и ожидалось в учебнике. Также мне нужно было импортировать файл, добавляемый плагинами (cordova.js) в index.html. Обычно это должно быть сгенерировано командой create ...

Также, если я хочу использовать Listview в виджете, сервис WidgetService для этого не работает для меня. Поэтому я удаляю его из AndroidManifest и использую свой собственный Сервис, как в родном приложении. Поэтому android.appwidget не работает, однако я также могу использовать его, вызывая его «вручную».

Итак, я уже получил виджет, но есть еще вопросы, почему он должен находиться в папке platform / android / app и не используется, если я копирую его вне его ...

...