1

我的应用程序会在选择文件时调用 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"));

                    }

                }
            }
        }
4

1 回答 1

1

解决方法:找出设备对你的意图支持哪些应用,找到蓝牙的那个,直接调用。

这篇文章回答了你的问题: 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 组件。

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

于 2012-12-27T21:31:39.670 回答