web-dev-qa-db-ja.com

カレンダーアプリのようにアプリアイコンを動的に変更する方法はありますか?

Androidアプリケーションを作成します。ユーザーのホーム画面でカレンダーアイコンが更新されるのと同様に、アプリアイコンを動的かつ自動的に更新します。

カレンダーは、月の日を示す日ごとにアイコンを変更します。現在の時刻を設定するアイコンを変更する、言い換えれば、毎分変更する目覚まし時計アプリもあります。

これはウィジェットではなく、実際のアプリのアイコンです。次に、それを行う方法が必要です。アプリでどうすればいいですか?

19
Lennon Petrick

ホーム画面が何であれ、カレンダーアプリや目覚まし時計アプリに特別なフックがあります。一般に、アプリはアイコンを更新できません。

フックとはどういう意味ですか?

たとえば、SamsungはSamsungデバイスでSamsungカレンダーアプリを出荷できます。これらの同じサムスンデバイス上のサムスンのホーム画面には、サムスンのカレンダーアプリのアイコンをレンダリングするための特別なルール、つまり月の日付を表示するルールがあります。これは、Samsungがホーム画面を作成したためです。サードパーティのホーム画面をインストールする場合、同じことをしない場合があります。結局のところ、私は1時間かそこらでホーム画面を書くことができ、Samsungのカレンダーアプリに特別なことをする必要はないと確信しています。

開発者がサムスンのホーム画面に接続してこの種のことを通知できるようにするために、サムスンが何らかのAPIを公開することを止めるものは何もありません。サードパーティがそのAPIを使用するためにSamsung intendsを使用するのか、それとも、Samsungが独自のアプリでそれを行う方法をハッキングする誰かであるのかどうかは、私には言えません。

(ところで、私はここで可能な例としてサムスンを引用しています-彼らが実際にこの種の機能を持っているかどうかはわかりません、もしそうならどのデバイスに持っていますか)

誰かがさまざまなホーム画面の独自のAPIをラップしようとするGitHubプロジェクトを持っていることを思い出すようです。 IIRC、サポートされている機能には、アプリアイコンの置換またはバッジの追加(未読メッセージ数など)が含まれていました。しかしながら:

  • これらの独自のAPIをサポートするデバイスはごくわずかです

  • リバースエンジニアリングアプリを通じて発見された、文書化されておらず、サポートされていないAPIは、変更される可能性があり、予期しない方法で破損する可能性があります

ダイナミックアプリアイコンをサポートするAndroid SDKには何もありません。私が知っている唯一のことは、<activity-alias>を使用してN個の異なる「アクティビティ」を持つことです、すべて同じ実装を指しますが、アイコンが異なりますPackageManagersetComponentEnabledSetting()を使用して、アプリは古いランチャーエイリアスを無効にし、ホーム画面が表示されることを期待して別のエイリアスを有効にしますこれについては、新しいアイコンが表示されます。

問題を回避するために、ホーム画面を書くことができます。たぶん、標準がありませんが、アプリがアイコンをオンザフライで変更する何らかの方法を提供したいと思います。たぶんそうではない。ホーム画面は視覚障害者向けに最適化されており、テキスト読み上げとハードウェアキー入力を使用しているため、おそらくアイコンをまったく使用するつもりはありません。それは私のホーム画面の実装であり、私はやりたいことができます。

20
CommonsWare

実際、Android Oのアプリドロワーでも、時計アプリアイコンは現在の時刻を表示し、カレンダーアプリアイコンは現在の日付を表示します。

この記事の説明

有名なアクションランチャーの開発者であるクリスレイシーは、時計アプリのAPKファイルでAndroid O:manifest.xmlが時間、分、秒に言及しているものを発見しましたデフォルト値を持つレイヤーとして、アイコンには背景と異なる要素に別々の画像があります。

論理的に彼は、Android Oで始まる時計アプリのアイコンは現在の時刻を表示するようにアニメーション化されます。これは、時計がホーム画面のショートカットとして配置されたときとアプリの引き出しの中にあるとき。

Pixelランチャーは、日時に応じて異なるアイコン画像レイヤーリソースを選択するようです。

5
Jerry101

ランチャーは、カレンダーアプリから毎日のアイコンにアクセスして、動的なカレンダーを処理します。たとえば、Googleカレンダーでは、ランチャー開発者は次のことを実行できます。

Resources res = activity.getPackageManager()
                            .getResourcesForApplication("com.google.Android.calendar");
int resId = res.getIdentifier("logo_calendar_01_regular", "drawable"
                            , "com.google.Android.calendar");
Drawable icon = res.getDrawable(resId);

これは、月の1日目のカレンダーアイコンにアクセスします。それ以外の日にアクセスするには、「logo_calendar_01_regular」が現在の日に変更されます。たとえば、7日目は「logo_calendar_07_regular」になります。また、Googleカレンダーには「logo_calendar_01_regular」と「logo_calendar_01_round」の2つのスタイルがあります。

また、アイコンテーマには、日付ごとに個別のアイコンも含まれています。

3
Michael Kern

私は同じ質問を持っていますが、ここで提供される答えはそれを解決しません。
私はGoogle Pixel 2 with raw Androidボード上のOre 8.1であり、時間とともに変化する2つのアプリがあります:カレンダーおよび時計時計アプリの時計の針は現在の時刻を表示し、カレンダーアイコンの数字は今日の日付に対応します月。
デフォルトのランチャーであることを考慮すると、おそらく同様のことを行うAPIがいくつかあります。

たとえば、アイコン上の惑星の位置を反映するのは惑星アプリかもしれません。または、使用済みメモリの割合を示すメモリクリーナ...

2
oleg.semen

私はランチャー開発者です。

動的アイコンフックに関連することは何もしませんでした。 Android API。によって提供される標準的な方法でアクティビティのアイコンを取得します。

そして、私のランチャーは、時計アプリのアイコンに現在の時刻を表示し、カレンダーのアイコンに現在の日付を表示することがわかりました。

デバイスはNubia Xで、Android 8。

オペレーティングシステムは、2つのアプリで何かを実行し、ランチャーに気付かれずにアイコンを動的に変更する必要がありました。

これら2つのアプリは、デバイスの製造元によって開発されています。サードパーティの開発者と同じことを通常の方法で行うことはできません。

0
蔡火胜