Как найти путь хранения моего Android-приложения в файле apk

Я хочу сделать приложение, которое может отправлять себя (файл apk) по Bluetooth. но у меня проблемы с поиском пути файла 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);

но st возвращает нулевое значение. Пожалуйста, помогите мне с этим. заранее спасибо

3 ответа

Решение

Наконец -то я нашел правильный ответ, который подходит для этой цели, спасибо @Kanak за помощь:)

PackageManager pm = getPackageManager();
    String uri = null;
    for (ApplicationInfo app : pm.getInstalledApplications(0)) {
        if(!((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 1))
            if(!((app.flags & ApplicationInfo.FLAG_SYSTEM) == 1)){
                uri=app.sourceDir;
                  if(uri.contains("com.example.test"))
                  break;
            }
    }

    Intent intent = new Intent();  
    intent.setAction(Intent.ACTION_SEND);  
    intent.setType("image/*");
    intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(uri)));
    startActivity(intent);

Там нет необходимости в итерации. Получить само приложение APK file uri так же просто, как это:

String appUri = getApplicationInfo().publicSourceDir;

Также обратите внимание, что док говорит об этом 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"));
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);
}

Выводит что-то вроде этого:

package: com.tmobile.themechooser, sourceDir: /system/app/ThemeChooser.apk
package: com.tmobile.thememanager, sourceDir: /system/app/ThemeManager.apk
package: com.touchtype.swiftkey, sourceDir: /data/app/com.touchtype.swiftkey-1.apk
package: com.twitter.android, sourceDir: /data/app/com.twitter.android-2.apk
package: fm.last.android, sourceDir: /data/app/fm.last.android-1.apk

Таким образом, вы найдете путь ко всем приложениям apk.

Другие вопросы по тегам