自分のプログラムを更新する方法を知っています。また、事前定義されたUriを使用してプログラムを開く方法を知っています(たとえば、SMSや電子メール用)
MyTracksまたは他のアプリケーションがどのインテントをリッスンしているかを知らないアプリケーションを開くためのインテントを作成する方法を知る必要があります。
この情報はDDMSから取得しましたが、これを使用できるインテントに変えることに成功していません。これは、MyTracksを手動で開いたときのものです。
ご協力いただきありがとうございます
05-06 11:22:24.945: INFO/ActivityManager(76): Starting activity: Intent { act=Android.intent.action.MAIN cat=[Android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.google.Android.maps.mytracks/com.google.Android.apps.mytracks.MyTracks bnds=[243,338][317,417] }
05-06 11:22:25.005: INFO/ActivityManager(76): Start proc com.google.Android.maps.mytracks for activity com.google.Android.maps.mytracks/com.google.Android.apps.mytracks.MyTracks: pid=1176 uid=10063 gids={3003, 1015}
05-06 11:22:26.995: INFO/ActivityManager(76): Displayed activity com.google.Android.maps.mytracks/com.google.Android.apps.mytracks.MyTracks: 1996 ms (total 1996 ms)
まず、Androidの「アプリケーション」の概念は少し拡張されています。
アプリケーション-技術的にはプロセス-は、複数のアクティビティ、サービス、コンテンツプロバイダー、および/またはブロードキャストリスナーを持つことができます。少なくとも1つが実行されている場合、アプリケーションは稼働しています(プロセス)。
したがって、特定する必要があるのは、「アプリケーションを起動する」方法です。
OK ...試してみてください:
action=MAIN
およびcategory=LAUNCHER
でインテントを作成しますcontext.getPackageManager
を使用して、現在のコンテキストからPackageManager
を取得しますpackageManager.queryIntentActivity(<intent>, 0)
intentにはcategory=LAUNCHER
、action=MAIN
、またはpackageManager.resolveActivity(<intent>, 0)
があり、main/launcherで最初のアクティビティを取得しますActivityInfo
を取得するActivityInfo
から、packageName
およびname
を取得しますcategory=LAUNCHER
、action=MAIN
、componentName = new ComponentName(packageName, name)
、setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
を使用して別のインテントを作成しますcontext.startActivity(newIntent)
私はこのように仕事をしています
/** Open another app.
* @param context current Context, like Activity, App, or Service
* @param packageName the full package name of the app to open
* @return true if likely successful, false if unsuccessful
*/
public static boolean openApp(Context context, String packageName) {
PackageManager manager = context.getPackageManager();
try {
Intent i = manager.getLaunchIntentForPackage(packageName);
if (i == null) {
return false;
//throw new ActivityNotFoundException();
}
i.addCategory(Intent.CATEGORY_LAUNCHER);
context.startActivity(i);
return true;
} catch (ActivityNotFoundException e) {
return false;
}
}
使用例:
openApp(this, "com.google.Android.maps.mytracks");
それが誰かを助けることを願っています。
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(ComponentName.unflattenFromString("com.google.Android.maps.mytracks/com.google.Android.apps.mytracks.MyTracks"));
intent.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(intent);
編集:
コメントで示唆されているように、startActivity(intent);
の前に1行追加します
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
アクティブ化するパッケージ名が既にある場合は、もう少し一般的な次のコードを使用できます。
PackageManager pm = context.getPackageManager();
Intent appStartIntent = pm.getLaunchIntentForPackage(appPackageName);
if (null != appStartIntent)
{
context.startActivity(appStartIntent);
}
MAINアクティビティを開始する通常の方法でメインアクティビティが見つからなかった場合に、よりうまく機能することがわかりました。
これは、MasterGauravソリューションに基づく私のソリューションのコードです。
private void launchComponent(String packageName, String name){
Intent launch_intent = new Intent("Android.intent.action.MAIN");
launch_intent.addCategory("Android.intent.category.LAUNCHER");
launch_intent.setComponent(new ComponentName(packageName, name));
launch_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(launch_intent);
}
public void startApplication(String application_name){
try{
Intent intent = new Intent("Android.intent.action.MAIN");
intent.addCategory("Android.intent.category.LAUNCHER");
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
List<ResolveInfo> resolveinfo_list = activity.getPackageManager().queryIntentActivities(intent, 0);
for(ResolveInfo info:resolveinfo_list){
if(info.activityInfo.packageName.equalsIgnoreCase(application_name)){
launchComponent(info.activityInfo.packageName, info.activityInfo.name);
break;
}
}
}
catch (ActivityNotFoundException e) {
Toast.makeText(activity.getApplicationContext(), "There was a problem loading the application: "+application_name,Toast.LENGTH_SHORT).show();
}
}
逆変換のソリューションを使用して、目的のアプリケーションが現在インストールされていないときに呼び出される関数でスニペットを拡張しました。 パッケージ名でアプリケーションを実行します。見つからない場合は、Android market-Google Play for this packageのように動作します。
public void startApplication(String packageName)
{
try
{
Intent intent = new Intent("Android.intent.action.MAIN");
intent.addCategory("Android.intent.category.LAUNCHER");
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
List<ResolveInfo> resolveInfoList = getPackageManager().queryIntentActivities(intent, 0);
for(ResolveInfo info : resolveInfoList)
if(info.activityInfo.packageName.equalsIgnoreCase(packageName))
{
launchComponent(info.activityInfo.packageName, info.activityInfo.name);
return;
}
// No match, so application is not installed
showInMarket(packageName);
}
catch (Exception e)
{
showInMarket(packageName);
}
}
private void launchComponent(String packageName, String name)
{
Intent intent = new Intent("Android.intent.action.MAIN");
intent.addCategory("Android.intent.category.LAUNCHER");
intent.setComponent(new ComponentName(packageName, name));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
private void showInMarket(String packageName)
{
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
そして、次のように使用されます。
startApplication("org.teepee.bazant");
アプリケーションが存在する場合は開くか、Playストアアプリケーションを開いてインストールします。
private void open() {
openApplication(getActivity(), "com.app.package.here");
}
public void openApplication(Context context, String packageN) {
Intent i = context.getPackageManager().getLaunchIntentForPackage(packageN);
if (i != null) {
i.addCategory(Intent.CATEGORY_LAUNCHER);
context.startActivity(i);
} else {
try {
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageN)));
}
catch (Android.content.ActivityNotFoundException anfe) {
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + packageN)));
}
}
}
これを使って :
PackageManager pm = getPackageManager();
Intent intent = pm.getLaunchIntentForPackage("com.package.name");
startActivity(intent);
アプリケーションアクティビティから別のアプリケーションアクティビティを開始するには。それは私のためにうまく機能しています。
次のコードは、別のアプリケーションが既にお使いの携帯電話にインストールされている場合に機能します。そうでない場合、あるアプリから別のアプリにリダイレクトすることはできません。そのため、アプリを起動するかどうかを確認してください
Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
startActivity(intent);
//これはAndroid Lollipop 5.0.2で機能します
public static boolean launchApp(Context context, String packageName) {
final PackageManager manager = context.getPackageManager();
final Intent appLauncherIntent = new Intent(Intent.ACTION_MAIN);
appLauncherIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfos = manager.queryIntentActivities(appLauncherIntent, 0);
if ((null != resolveInfos) && (!resolveInfos.isEmpty())) {
for (ResolveInfo rInfo : resolveInfos) {
String className = rInfo.activityInfo.name.trim();
String targetPackageName = rInfo.activityInfo.packageName.trim();
Log.d("AppsLauncher", "Class Name = " + className + " Target Package Name = " + targetPackageName + " Package Name = " + packageName);
if (packageName.trim().equals(targetPackageName)) {
Intent intent = new Intent();
intent.setClassName(targetPackageName, className);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
Log.d("AppsLauncher", "Launching Package '" + packageName + "' with Activity '" + className + "'");
return true;
}
}
}
return false;
}
Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
startActivity(launchIntent);
APIレベル3+の場合、1行のコードのみ:
Intent intent = context.getPackageManager().getLaunchIntentForPackage("name.of.package");
CATEGORY_INFO起動インテントを返します(ランチャーアクティビティのないアプリ、たとえば壁紙は、これを使用してアプリに関する情報を提供します)。見つからない場合は、パッケージのCATEGORY_LAUNCHが存在する場合はそれを返します。
または、次のコマンドを使用して、他のアプリでアプリからインテントを開くこともできます。
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
ここで、uri
は他のアプリへのディープリンクです
以下を使用してください:
String packagename = "com.example.app";
startActivity(getPackageManager().getLaunchIntentForPackage(packagename));
あなたが活動ではなくサービスを開始しようとしている場合、これは私のために働いた:
Intent intent = new Intent();
intent.setClassName("com.example.otherapplication", "com.example.otherapplication.ServiceName");
context.startService(intent);
他の回答に記載されているintent.setComponent(...)メソッドを使用すると、「startServiceを使用した暗黙的なインテントは安全ではありません」という警告が表示される場合があります。
別のアプリケーションを開きたいがインストールされていない場合は、Google App Storeに送信してダウンロードできます
たとえば、まずopenOtherAppメソッドを作成します
public static boolean openOtherApp(Context context, String packageName) {
PackageManager manager = context.getPackageManager();
try {
Intent intent = manager.getLaunchIntentForPackage(packageName);
if (intent == null) {
//the app is not installed
try {
intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("market://details?id=" + packageName));
context.startActivity(intent);
} catch (ActivityNotFoundException e) {
//throw new ActivityNotFoundException();
return false;
}
}
intent.addCategory(Intent.CATEGORY_LAUNCHER);
context.startActivity(intent);
return true;
} catch (ActivityNotFoundException e) {
return false;
}
}
2.-使用法
openOtherApp(getApplicationContext(), "com.packageappname");
アプリケーションは電話の設定の多くを変更できないため、他のアプリケーションと同じように設定アクティビティを開くことができます。
実際に設定を手動で変更した後、LogCat出力を確認します。
INFO/ActivityManager(1306): Starting activity: Intent { act=Android.intent.action.MAIN cmp=com.Android.settings/.DevelopmentSettings } from pid 1924
次に、これを使用してアプリの設定ページを表示します。
String SettingsPage = "com.Android.settings/.DevelopmentSettings";
try
{
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(ComponentName.unflattenFromString(SettingsPage));
intent.addCategory(Intent.CATEGORY_LAUNCHER );
startActivity(intent);
}
catch (ActivityNotFoundException e)
{
log it
}
このコマンドを使用して、デバイスにインストールされているパッケージ名を見つけることができます。
adb Shell pm list packages -3 -f
参照: http://www.aftvnews.com/how-to-determine-the-package-name-of-an-Android-app/
このコードを試してください、これがあなたを助けることを願っています。このパッケージが利用可能な場合、アプリを開くか、Playストアを開いてダウンロードします
String packageN = "aman4india.com.pincodedirectory";
Intent i = getPackageManager().getLaunchIntentForPackage(packageN);
if (i != null) {
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);
} else {
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageN)));
}
catch (Android.content.ActivityNotFoundException anfe) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + packageN)));
}
}