2016-03-05 3 views
5

アンドロイドのカスタムキーボードを開発しています。キーボードのハングアウトなどで友達にスティッキーを送信したいと思います。私はこのためにいくつかのpngを追加しました。アンドロイドで開かれているアプリを検出する方法

私はアンドロイドの共有APIを使用すると、まず共有するアプリを選択する必要があります。キーボードから現在開いているアプリケーションを検出することは可能ですか?たとえば、ハングアウトでチャットしている場合は、「com.something.hangouts」と共有するようにインテントを呼び出すことができます。

FBメッセンジャーで「com.something.facebook.messenger」などと言えばこれは、ランチャーやキーボードをバック与える...

fun getOpenedApplication() { 
    var am = this.getSystemService(ACTIVITY_SERVICE) as ActivityManager; 

    var l = am.getRecentTasks(1, 
      ActivityManager.RECENT_WITH_EXCLUDED); 
    var i = l.iterator(); 

    var pm = this.packageManager; 

    while (i.hasNext()) { 
     try { 
      var intent = i.next().baseIntent; 
      var list = pm.queryIntentActivities(intent, 
        PackageManager.MATCH_DEFAULT_ONLY); 

      var c = pm.getApplicationLabel(pm.getApplicationInfo(
        list[0].activityInfo.packageName, 
        PackageManager.GET_META_DATA)); 

      Toast.makeText(this, "Application name: " + c.toString(), 
        Toast.LENGTH_LONG).show(); 

     } catch (e: Exception) { 
      Toast.makeText(this, 
        "Application name not found: " + e.toString(), 
        Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

しかし、それはうまく機能していない:...

私はこのようにそれを取得しようとしました。

(ランダムに)私は、最近使ったアプリのリストから最初のアプリを取得しようとしましたが、それは上記のAndroid Lと、使用のために

答えて

7

非常に簡単です。

String packageName = getCurrentInputEditorInfo().packageName; 

InputMethodServiceクラスのメソッド。

+1

ありがとう、これは解決策でした! – MegaX

+1

すばらしい。これを得るには、SOの多くのスレッドを通過しなければならなかった。名声! – Shahar

+1

ありがとう、あなたの側からの素晴らしい助け。 – Janak

4

を働いていませんでした:あなたはactivitymanagerからgetRunningAppProcesses APIを使用することができます

ActivityManager activityManager = (ActivityManager) newContext.getSystemService(Context.ACTIVITY_SERVICE); 
List<RunningAppProcessInfo> runAppProcessesList = activityManager.getRunningAppProcesses(); 
for (RunningAppProcessInfo runAppProcess : runAppProcessesList) { 
    if (runAppProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { 
     Log.d("current foreground App", runAppProcess.processName); 
    } 
} 
0

あなたの結果が1MB以上になると(基本的には30〜35個以上のアプリケーションが実行されている場合)、「TransactionTooLargeException」になります。これは、アンドロイドの実装では1 MB以上のバインダーデータを転送できません。

1

アクセシビリティサービスを使用することもできますが、それを有効にするには、ユーザーをアクセシビリティ設定にリダイレクトする必要があります。サンプルコードは、今開いたばかりのアプリのパッケージを入手するためのものです。

public class MyAccessibilityService extends AccessibilityService { 

@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 
     String packageName = event.getPackageName(); 
     if(packageName.equals("com.sample")) 
      //Do whatever you want 
    }} 

あなたは、現在実行中のアプリケーションは、現在実行中のアプリケーションは、次のコマンドを使用取得するには

public String getRunningAppPackageName() 
{ 
    ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> tasks = activityManager.getRunningTasks(1); 
    RunningTaskInfo p = (RunningTaskInfo) tasks.get(0); 

    return p.baseActivity.getPackageName();} 

キットカットまでのAndroidバージョンは、以下の機能を使用して取得するには、ここでAccessibility Services

4

を、それについての詳細を読むことができますkitkatの上のアンドロイド版の機能

 public String getRunningAppPackageName() 
{ 
    ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> tasks = activityManager.getRunningAppProcesses(); 


    return activityManager.getRunnningAppProcesses().get(0).processName;} 
+0

解決した問題thnx –

1

このコードをチェック

/** 
    * @param context 
    * @return 
    * @throws PackageManager.NameNotFoundException 
    */ 
    public String getRunningPackageName(Context context) throws PackageManager.NameNotFoundException { 
     ActivityManager mgr = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
     String packagename = ""; 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      List<ActivityManager.AppTask> tasks = mgr.getAppTasks(); 
      for (ActivityManager.AppTask task : tasks) { 
       packagename = task.getTaskInfo().baseIntent.getComponent().getPackageName(); 
       if (packagename.equalsIgnoreCase(context.getPackageName().toString())) { 
        break; 
       } 
      } 
     } else { 
      ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
      List<ActivityManager.RunningTaskInfo> alltasks = activityManager.getRunningTasks(1); 
      packagename = alltasks.get(0).topActivity.getPackageName(); 
     } 
     return packagename; 
    } 


    private void yourMethodName(Context context, Bundle notifyBundle) { 
      boolean isActivityFound = false; 
      String packageName = ""; 
      try { 
       packageName = getRunningPackageName(context); 
      } catch (PackageManager.NameNotFoundException e) { 
       e.printStackTrace(); 
      } 
    if (packageName.equalsIgnoreCase(context.getPackageName().toString())) { 
      isActivityFound = true; 
     } 
    } 
関連する問題