将Android PackageManager限制为单一选项

时间:2012-12-27 21:23:55

标签: android bluetooth

我的应用程序在选择文件时会唤起android PackageManager,并向用户提供应用程序选项来处理文件的处理方式。我想将此选择限制为蓝牙。目前蓝牙是第一个选择,这很好,这一切都有效。我想知道是否可能只向用户展示这个选项。

    case REQUEST_FILE_SELECT:
        if (requestCode == REQUEST_FILE_SELECT) {
            // Get the Uri of the selected file
            Uri uri = data.getData();
            Log.d(TAG, "File Uri: " + uri.toString());
            // Get the path
            String path = null;
            try {
                path = FileUtils.getPath(this, uri);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
            Log.d(TAG, "File Path: " + path);
            // Get the file instance
            File mFile = new File(path);
            // Evoke the file chooser
            List<Intent> targetedShareIntents = new ArrayList<Intent>();
            Intent shareIntent = new Intent(
                    android.content.Intent.ACTION_SEND);
            shareIntent.setType("*/*");
            // Evoke the package manager
            List<ResolveInfo> resInfo = getPackageManager()
                    .queryIntentActivities(shareIntent,
                            PackageManager.GET_ACTIVITIES);
            if (!resInfo.isEmpty()) {

                for (ResolveInfo resolveInfo : resInfo) {
                    String packageName = resolveInfo.activityInfo.packageName;
                    if (packageName.equals("com.android.bluetooth")) {

                        Intent targetedShareIntent = new Intent(
                                android.content.Intent.ACTION_SEND);
                        shareIntent.putExtra(Intent.EXTRA_STREAM,
                                Uri.fromFile(mFile));
                        targetedShareIntent.setPackage(packageName);
                        targetedShareIntents.add(targetedShareIntent);
                        startActivity(Intent.createChooser(shareIntent,
                                "Share File"));

                    }

                }
            }
        }

1 个答案:

答案 0 :(得分:1)

解决方案:找出设备支持您的意图的应用程序,找到bluetooh的应用程序,直接调用它。

这篇文章回答了你的问题: http://tsicilian.wordpress.com/2012/11/06/bluetooth-data-transfer-with-android/

从文章: 我们可以看到BT应用程序是那些处理程序之一。我们当然可以让用户从列表中选择该应用程序并完成它。但是,如果我们认为我们应该更加方便用户,我们需要更进一步,自己启动应用程序,而不是简单地将其显示在其他不必要的选项中......但是如何?

这样做的一种方法是以这种方式使用Android的PackageManager:

//list of apps that can handle our intent
PackageManager pm = getPackageManager();
List appsList = pm.queryIntentActivities( intent, 0);

if(appsList.size() > 0 {
   // proceed
}

上面的PackageManager方法以一个ResolveInfo对象列表的形式返回我们之前看到的易于处理我们文件传输意图的所有活动的列表,这些对象封装了我们需要的信息:

//select bluetooth
String packageName = null;
String className = null;
boolean found = false;

for(ResolveInfo info: appsList){
  packageName = info.activityInfo.packageName;
  if( packageName.equals("com.android.bluetooth")){
     className = info.activityInfo.name;
     found = true;
     break;// found
  }
}

if(! found){

  Toast.makeText(this, R.string.blu_notfound_inlist,
  Toast.LENGTH_SHORT).show();
  // exit
}

我们现在拥有自己启动BT的必要信息:

//set our intent to launch Bluetooth
intent.setClassName(packageName, className);
startActivity(intent);

我们所做的是使用之前检索的包及其相应的类。由于我们是一群好奇的人,我们可能想知道“com.android.bluetooth”包的类名是什么。如果我们要将它打印出来,我们就会得到这些:com.broadcom.bt.app.opp.OppLauncherActivity。 OPP代表Object Push Profile,是允许无线共享文件的Android组件。

同样在文章中,如何从您的应用程序启用蓝牙。