2014-01-28 5 views
1

Я хочу сделать приложение, которое может отправлять себя (файл apk) с помощью bluetooth. но у меня проблемы с поиском пути файла apk. Я пробовал этот код:как найти путь к файлу apk для приложения app app

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); 
+0

Эй, мой apk выходит как base.apk вместо appname.apk. Есть ли способ изменить название так же, как оно выходит? – Visionwriter

+0

@Visionwriter Я не пробовал, но думаю, вы можете сделать это, скопировав файл и переименовав его, а затем отправив переименованный файл. [здесь] (http://stackoverflow.com/a/4770586/3234630) пример того, как сделать копию и переименовать, я надеюсь, что это поможет. –

+0

Хорошо, попробуй, спасибо. – Visionwriter

1
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.

+0

спасибо, SourceDir был полезным, но все еще я не могу выбрать свое приложение из списка. if ((app.packageName) .contains ("testbuttun")) does not work –

+0

В чем разница между publicSourceDir и sourceDir? Оба, похоже, имеют такое же значение ... –

4

Там нет необходимости итерации. Получение самого APK файл 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")); 
+0

В чем разница между publicSourceDir и sourceDir? Оба, похоже, имеют одинаковую ценность ... –

+0

@androiddeveloper Как говорит документация, это ** разные ** в приложении ** Forward Locked **. Для получения дополнительной информации о приложениях форвардной блокировки вы можете увидеть [adb documentation] (https://developer.android.com/studio/command-line/adb.html) под опциями 'pm install'. – AliLotfi

+0

Вы имеете в виду это «-l: установите пакет с перемоткой вперед». ? Но что это значит? Что такое «приложение с принудительной блокировкой»? Предположим, я хочу поделиться APK приложения, следует ли использовать publicSourceDir или использовать sourceDir? –

Смежные вопросы