将Android PackageManager限制为单一选项
当选择一个文件时,我的应用程序会调用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
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”活动不一定在每个设备上都做相同的事情(更不用说你认为它做什么或用户希望它做什么了)