他のアプリの上にあるAndroidアプリ

2013年、Facebookはメッセンジャー用のチャットヘッド機能をリリースしました。これにより、メッセンジャー自体を開かずに、他のアプリケーションの上でもディスプレイに常に表示される小さな丸いウィンドウをクリックしてチャットできます。



画像






Facebookは、「他のアプリの描画」の実装を実証した最初の企業の1つです。 開発者は現在、この機会をさまざまな種類のアプリケーション(サイドスマートメニューからスクリーンレコーディングまで)で使用しています。 この記事では、例としてKhameleonスパイウェア対策プログラムを使用して、他のアプリケーションの最上位にあるアプリケーションを作成するプロセスを説明します。



最初に、アプリケーションの目的の概要を説明します。これは、他のアプリケーションの上にあるアプリケーションの例として実装されます。 私のスマートフォンを使用している間、隣の人が私のスマートフォンのコンテンツを簡単に見ることができないようにしたいとします。 つまり、機会が必要です。



  1. ディスプレイの一部を非表示にして、必要な領域のみを表示します
  2. 非表示領域の代わりに、目的のコンテンツ(たとえば、特定のWebページ)を表示します


このようなものは次のようになります。



画像



アプリケーションの機能を決定しました。次に、チュートリアル自体を見てみましょう。 他のアプリケーションの最上位にあるアプリケーションを作成するには、主に2つのコンポーネントがあります。





これら2つのコンポーネントを実装する前に、他のアプリケーションの上にあるアプリケーションの許可を取得する必要があります。 これを行うには、AndroidManifest.xmlで次を追加する必要があります。



<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
      
      





API> 23の場合、つまり Android M、メインアクティビティで許可をリクエストする必要があります。

 Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, __INT);
      
      





許可を取得した後、画面に表示する必要があるレイアウトを示します(多くの要素はデモのために削除されます)。



 <?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:background="@android:color/black"> <View android:id="@+id/grab" android:layout_width="40dp" android:layout_height="40dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="10dp"/> </RelativeLayout>
      
      





(任意で)ルートRelativeLayoutに、通常どおりView'shkiを配置できます。 id = "@ + id / grab"のビューは、レイアウトを動的にサイズ変更する方法を示すために必要です。 つまり、このView'skuを使用して、ルートRelativeLayoutをストレッチおよび圧縮することができます。



最小限のレイアウトができたら、最も一般的なサービスを実装する必要があります。 サービスの唯一の機能は、以前に作成されたレイアウトの追加です。



  @Override public void onCreate(){ super.onCreate(); manager = (WindowManager) getSystemService(WINDOW_SERVICE); params = new WindowManager.LayoutParams( screenWidth, //   screenHeight, //   WindowManager.LayoutParams.TYPE_PHONE, // ,     .   API > 26,     TYPE_APPLICATION_OVERLAY WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, //     TouchEvent'        PixelFormat.TRANSLUCENT); //    //     Layout topParams.gravity = Gravity.TOP | Gravity.RIGHT; params.x = 0; params.y = 0; //   Layout rootView = (RelativeLayout) LayoutInflater.from(this).inflate(R.layout._, null); windowManager.addView(rootView, params);
      
      





この段階で、レイアウトは他のアプリケーションの上に正常に表示されます。 次に、レイアウトを動的にサイズ変更する方法を検討します。



 rootView.findViewById(R.id.grab).setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) { //       Layout' params.height = (int) motionEvent.getRawY() manager.updateView(topView, topParams); } return true; } });
      
      





レイアウトエッジを上下に動かすと、それに応じて高さが縮小または拡大します。



他のアプリケーションの上にアプリケーションを作成するために最低限必要な手順を検討しました。 上記のKhameleonアプリケーションの完全なコードは、 ここにあります



All Articles