如何找到我的android应用程序';s apk文件的存储路径

如何找到我的android应用程序';s apk文件的存储路径,android,package-managers,Android,Package Managers,我想做一个应用程序,可以发送自己(apk文件)通过蓝牙。但是我很难找到apk文件路径。我尝试了以下代码: final PackageManager pm = this.getPackageManager(); List<PackageInfo> packages = pm.getInstalledPackages(PackageManager.GET_META_DATA); String st = null; for (PackageInfo package

我想做一个应用程序,可以发送自己(apk文件)通过蓝牙。但是我很难找到apk文件路径。我尝试了以下代码:

final PackageManager pm = this.getPackageManager();
    List<PackageInfo> packages =  pm.getInstalledPackages(PackageManager.GET_META_DATA);
    String st = null;
    for (PackageInfo packageInfo : packages) {
        if(packageInfo.packageName.contains("testbutton"))
        st=packageInfo.packageName;
    }

    Intent intent = new Intent();  
    intent.setAction(Intent.ACTION_SEND);  
    intent.setType("image/*");

    String uri = "/data/app/";
    uri+=st;
    intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(uri)));
    startActivity(intent);
final PackageManager pm=this.getPackageManager();
List packages=pm.getInstalledPackages(PackageManager.GET_元数据);
字符串st=null;
用于(PackageInfo-PackageInfo:Package){
if(packageInfo.packageName.contains(“testbutton”))
st=packageInfo.packageName;
}
意图=新意图();
intent.setAction(intent.ACTION\u SEND);
intent.setType(“image/*”);
字符串uri=“/data/app/”;
uri+=st;
intent.putExtra(intent.EXTRA_流,Uri.fromFile(新文件(Uri)));
星触觉(意向);
但是st返回空值。 请帮我做这个。提前谢谢

List<ApplicationInfo> PackageManager.getInstalledApplications() // will give you a list of the installed applications, and 
ApplicationInfo.sourceDir  //is the path to the .apk file.

PackageManager pm = getPackageManager();

for (ApplicationInfo app : pm.getInstalledApplications(0)) {
  Log.d("PackageList", "package: " + app.packageName + ", sourceDir: " + app.sourceDir);
}
所以,通过这种方式,您将找到所有apk应用程序的路径


因此,通过这种方式,您将找到所有apk应用程序的路径。

最后,我找到了适用于此目的的正确答案,感谢@Kanak的帮助:)


最后,我找到了适用于此目的的正确答案,感谢@Kanak的帮助:)


不需要迭代。获取应用程序本身的APK文件uri非常简单,如下所示:

String appUri = getApplicationInfo().publicSourceDir;
还请注意,doc是这样说的,关于
publicSourceDir

sourceDir
的公共可用部分的完整路径, 包括资源和清单。这可能不同于
sourceDir
如果应用程序被前向锁定

还要注意,要发送APK文件,需要将类型设置为
application/vnd.android.package archive
,而不是
image/*

因此,完整的片段应该是:

String appUri = getApplicationInfo().publicSourceDir;
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("application/vnd.android.package-archive");
sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(appUri)));
startActivity(Intent.createChooser(sharingIntent, "Share via"));

不需要迭代。获取应用程序本身的APK文件uri非常简单,如下所示:

String appUri = getApplicationInfo().publicSourceDir;
还请注意,doc是这样说的,关于
publicSourceDir

sourceDir
的公共可用部分的完整路径, 包括资源和清单。这可能不同于
sourceDir
如果应用程序被前向锁定

还要注意,要发送APK文件,需要将类型设置为
application/vnd.android.package archive
,而不是
image/*

因此,完整的片段应该是:

String appUri = getApplicationInfo().publicSourceDir;
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("application/vnd.android.package-archive");
sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(appUri)));
startActivity(Intent.createChooser(sharingIntent, "Share via"));

谢谢,sourceDir很有用,但我仍然无法从列表中选择我自己的应用程序。如果((app.packageName.contains(“TestButton”))不起作用,publicSourceDir和sourceDir之间有什么区别?两者似乎都有相同的价值…谢谢,sourceDir很有用,但我仍然无法从列表中选择我自己的应用程序。如果((app.packageName.contains(“TestButton”))不起作用,publicSourceDir和sourceDir之间有什么区别?两者似乎都有相同的值…嘿,我的apk将作为base.apk而不是appname.apk输出。是否有办法在文件即将发布时更改名称?@Visionwriter我还没有尝试过,但我认为您可以通过复制文件并重命名,然后发送重命名的文件来完成。作为一个如何进行复制和重命名的示例,我希望它能帮助您在使用targetSdk 24或更高版本时.Uri.fromFile不再工作。嘿,我的apk将作为base.apk而不是appname.apk发布。是否有办法在文件即将发布时更改名称?@Visionwriter我还没有尝试过,但我认为您可以通过复制文件并重命名,然后发送重命名的文件来完成。作为一个如何进行复制和重命名的示例,我希望它能帮助您。当您使用targetSdk 24或更高版本时,Uri.fromFile不再工作。publicSourceDir和sourceDir之间有什么区别?两者似乎都有相同的价值…@androiddeveloper如文档所述,在前向锁定的应用程序中是不同的。有关前向锁定应用程序的更多信息,请参见
pm install
选项。您的意思是“-l:使用前向锁定安装软件包。”?但这意味着什么?什么是“前向锁定应用程序”?假设我希望共享应用程序的APK,我应该使用publicSourceDir还是使用sourceDir?@androiddeveloper前向锁定应用程序是安装程序不希望用户共享应用程序包的应用程序。因此,即使您愿意,也无法访问前向锁定应用程序的sourceDir(至少在没有根访问的情况下)。因此,对于正常使用,请始终使用
publicSourceDir
。我认为“-l”不起作用。“adb”工具说这是一个未知参数。。。此处:。另外,在我的所有应用程序(包括系统应用程序)中,两个文件都有相同的路径。publicSourceDir和sourceDir之间有什么区别?两者似乎都有相同的价值…@androiddeveloper如文档所述,在前向锁定的应用程序中是不同的。有关前向锁定应用程序的更多信息,请参见
pm install
选项。您的意思是“-l:使用前向锁定安装软件包。”?但这意味着什么?什么是“前向锁定应用程序”?假设我希望共享应用程序的APK,我应该使用publicSourceDir还是使用sourceDir?@androiddeveloper前向锁定应用程序是安装程序不希望用户共享应用程序包的应用程序。因此,即使您愿意,也无法访问前向锁定应用程序的sourceDir(至少在没有根访问的情况下)。因此,对于正常使用,请始终使用
publicSourceDir
。我认为“-l”不起作用。“adb”工具说这是一个未知参数。。。此处:。此外,在所有我的应用程序(包括系统应用程序)中,两个文件的路径相同。