将Android PackageManager限制为单一选项

将Android PackageManager限制为单一选项,android,bluetooth,Android,Bluetooth,当选择一个文件时,我的应用程序会调用android PackageManager,用户可以选择应用程序来处理该文件。我想将此选项限制为蓝牙。目前,蓝牙作为第一个选择出现,这是好的,这一切工作。我想知道是否有可能只向用户提供这个选项 case REQUEST_FILE_SELECT: if (requestCode == REQUEST_FILE_SELECT) { // Get the Uri of the selected file

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

                    }

                }
            }
        }
case REQUEST\u FILE\u选择:
if(requestCode==请求文件选择){
//获取所选文件的Uri
Uri=data.getData();
Log.d(标记,“文件Uri:+Uri.toString());
//找到路
字符串路径=null;
试一试{
path=FileUtils.getPath(这个uri);
}捕获(URISyntaxException e){
e、 printStackTrace();
}
Log.d(标记“文件路径:”+Path);
//获取文件实例
File mFile=新文件(路径);
//调用文件选择器
List targetedShareContents=new ArrayList();
意向共享意向=新意向(
android.content.Intent.ACTION(发送);
shareIntent.setType(“*/*”);
//调用包管理器
List resInfo=getPackageManager()
.查询活动(共享意图,
PackageManager.GET_活动);
如果(!resInfo.isEmpty()){
对于(ResolveInfo ResolveInfo:resInfo){
字符串packageName=resolveInfo.activityInfo.packageName;
if(packageName.equals(“com.android.bluetooth”)){
意向targetedShareContent=新意向(
android.content.Intent.ACTION(发送);
shareIntent.putExtra(Intent.EXTRA_流,
fromFile(mFile));
targetedShareContent.setPackage(packageName);
targetedShareIntents.add(targetedShareIntent);
startActivity(Intent.createChooser(shareIntent,
“共享文件”);
}
}
}
}

解决方案:找出设备支持哪些应用程序,找到bluetooh,直接调用它

本文回答了您的问题:

从文章中: 我们可以看到,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.opp活动。OPP代表对象推送配置文件,是允许无线共享文件的Android组件


在本文中,还将介绍如何从应用程序中启用蓝牙。

解决方案:找出设备支持哪些应用程序,找到bluetooh,直接调用它

本文回答了您的问题:

从文章中: 我们可以看到,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.opp活动。OPP代表对象推送配置文件,是允许无线共享文件的Android组件


文章中还介绍了如何从应用程序启用蓝牙。

用户可以控制数据发送的位置和方式。

最有可能的选择是不要使用
操作发送。毕竟,“蓝牙”不会出现在所有设备上,也可能不会在它所使用的设备上具有相同的功能。所以,如果你真的想通过蓝牙来处理你的数据,那就自己动手吧。谢谢,但这是一个蓝牙应用程序。它不是为没有蓝牙的设备设计的。我不是指蓝牙技术。我指的是“蓝牙”,您在选择器中看到的条目。在任何给定的Android设备上都不必有“Bluetooth”活动出现在选择器中,而且“Bluetooth”活动不一定在每个设备上都做相同的事情(更不用说你认为它做什么或用户希望它做什么了)