如何检测是否安装了应用程序然后采取措施

时间:2018-02-15 02:36:37

标签: java android

在我的应用程序中,我想检测是否安装了像VLC这样的应用程序 如果是这样,当用户点击按钮时,我的应用程序将继续播放视频,但如果没有,该应用程序将引导用户到App Store下载应用程序。

有没有办法检测是否安装了特定的应用程序?

2 个答案:

答案 0 :(得分:1)

试试这个:

PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(***REPLACE_WITH_YOUR_INTENT***,
        PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;

来自Android Docs

  

虽然Android平台保证某些意图会   解析其中一个内置应用程序(如电话,电子邮件或   日历应用),您应该始终包含验证步骤   调用意图。

     

验证是否有可以响应的活动   intent,调用queryIntentActivities()来获取活动列表   能够处理你的意图。如果返回的List不为空,   你可以安全地使用意图。

     

注意:您应该在活动首次开始时执行此检查   你需要在之前禁用使用意图的功能   用户尝试使用它。如果您知道可以处理的特定应用程序   意图,你也可以提供一个供用户下载的链接   应用(请参阅如何在Google Play上链接到您的产品)。

所以,你可以这样使用:

Intent vlcIntent = new Intent(Intent.ACTION_VIEW);
vlcIntent.setPackage("org.videolan.vlc");

PackageManager packageManager = getPackageManager();
    List activities = packageManager.queryIntentActivities(vlcIntent,
            PackageManager.MATCH_DEFAULT_ONLY);
    boolean isIntentSafe = activities.size() > 0;

if (isIntentSafe){    
    startActivity(vlcIntent);
} else {
    Intent marketIntent = new Intent(Intent.ACTION_VIEW);
    marketIntent.setData(Uri.parse("market://details?id=org.videolan.vlc"));
    startActivity(marketIntent);
}

另外,另一个可能有用的链接(VideoLan Wiki):

Android Video Player Intents
它说:

  

对于简单的媒体播放:

 int vlcRequestCode = 42;  Uri uri =
Uri.parse("file:///storage/emulated/0/Movies/KUNG FURY Official
Movie.mp4");  Intent vlcIntent = new Intent(Intent.ACTION_VIEW); 
vlcIntent.setPackage("org.videolan.vlc"); 
vlcIntent.setDataAndTypeAndNormalize(uri, "video/*"); 
vlcIntent.putExtra("title", "Kung Fury"); 
vlcIntent.putExtra("from_start", false); 
vlcIntent.putExtra("position", 90000l); 
vlcIntent.putExtra("subtitles_location",
"/sdcard/Movies/Fifty-Fifty.srt");  startActivityForResult(vlcIntent,
vlcRequestCode);
     

如果您特别想要启动VideoPlayerActivity,可以设置

 vlcIntent.setComponent(new ComponentName("org.videolan.vlc",
 "org.videolan.vlc.gui.video.VideoPlayerActivity"));

您还可以将代码放入布尔代码块并传入您的意图,这样您就可以重用代码。像这样:

private boolean checkIntent(Intent intent) {
    PackageManager packageManager = getPackageManager();
    List activities =     packageManager.queryIntentActivities(intent,
        PackageManager.MATCH_DEFAULT_ONLY);
        boolean isIntentSafe = activities.size() > 0;

        return isIntentSafe;
}

答案 1 :(得分:0)

您需要检查VLC的软件包是否已安装。如果未安装,则打开显示vlc安装页面的Play商店。

这是来源:

String appPackageName = "org.videolan.vlc";
try {
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
} catch (android.content.ActivityNotFoundException anfe) {
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
}

以下来源将检查是否有任何可播放视频的内容,如果没有,则会提示用户安装VLC。这是一个可以帮助其他用户的更完整的示例。它检查本地安装的任何内容是否可以播放该文件,如果没有,则检查vlc,如果未安装VLC,则会将用户带到Play商店。

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromFile(file));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString());
String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
intent.setDataAndType(Uri.fromFile(file), mimetype);

PackageManager manager = context.getPackageManager();
List<ResolveInfo> resolveInfoList = manager.queryIntentActivities(intent, 0);
if (resolveInfoList.size() > 0) {
    context.startActivity(intent);
} else {
    FragmentManager fragmentManager = ((AppCompatActivity) context).getSupportFragmentManager();
    ClassChatRecyclerAdapter.InstallVlcDialogFragment.newInstance(extension).show(fragmentManager, "INSTALL_VLC");
}

这是检查VLC的对话框,如果找不到,则会将用户带到Play商店进行安装。您可以使用下面的源代码的try / catch部分来专门解决您的问题。

public static class InstallVlcDialogFragment extends DialogFragment {

    public static ClassChatRecyclerAdapter.InstallVlcDialogFragment newInstance(String mediaType) {
        ClassChatRecyclerAdapter.InstallVlcDialogFragment frag = new ClassChatRecyclerAdapter.InstallVlcDialogFragment();
        Bundle args = new Bundle();
        args.putString("mediaType", mediaType);
        frag.setArguments(args);
        return frag;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        String mediaType = getArguments().getString("mediaType");

        return new AlertDialog.Builder(getActivity(), R.style.AppDialogTheme)
                .setTitle("Unable to find video player for " +mediaType + " files.")
                .setMessage("Install VLC Player to play file?")
                .setPositiveButton("OK",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                String appPackageName = "org.videolan.vlc";
                                try {
                                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
                                } catch (android.content.ActivityNotFoundException anfe) {
                                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
                                }
                                dismiss();
                            }
                        }
                )
                .setNegativeButton("Cancel",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                dismiss();
                            }
                        }
                )
                .create();
    }
}