내 응용 프로그램은 다른 응용 프로그램을 설치하며 설치된 응용 프로그램을 추적해야합니다. 물론 설치된 응용 프로그램 목록을 유지하면됩니다. 그러나 이것은 필요하지 않습니다! installedBy (a, b) 관계를 유지하는 것은 PackageManager의 책임입니다. 실제로 API에 따르면 다음과 같습니다.
public abstract String getInstallerPackageName (String packageName)- 패키지를 설치 한 응용 프로그램의 패키지 이름을 검색합니다. 이것은 패키지가 어느 시장에서 왔는지 식별합니다.
현재 접근
의도를 사용하여 APK 설치
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
startActivity(intent);
의도를 사용하여 APK 제거 :
Intent intent = new Intent(Intent.ACTION_DELETE, Uri.fromParts("package",
getPackageManager().getPackageArchiveInfo(apkUri.getPath(), 0).packageName,null));
startActivity(intent);
예를 들어 Android 마켓에서 패키지를 설치 / 제거하는 방식은 아닙니다. 더 풍부한 버전의 PackageManager를 사용합니다. Android Git 리포지토리에서 Android 소스 코드를 다운로드하면 알 수 있습니다. 아래는 의도 접근 방식에 해당하는 두 가지 숨겨진 방법입니다. 불행히도 외부 개발자는 사용할 수 없습니다. 그러나 아마도 그들은 미래에 있을까요?
더 나은 접근법
PackageManager를 사용하여 APK 설치
/**
* @hide
*
* Install a package. Since this may take a little while, the result will
* be posted back to the given observer. An installation will fail if the calling context
* lacks the {@link android.Manifest.permission#INSTALL_PACKAGES} permission, if the
* package named in the package file's manifest is already installed, or if there's no space
* available on the device.
*
* @param packageURI The location of the package file to install. This can be a 'file:' or a
* 'content:' URI.
* @param observer An observer callback to get notified when the package installation is
* complete. {@link IPackageInstallObserver#packageInstalled(String, int)} will be
* called when that happens. observer may be null to indicate that no callback is desired.
* @param flags - possible values: {@link #INSTALL_FORWARD_LOCK},
* {@link #INSTALL_REPLACE_EXISTING}, {@link #INSTALL_ALLOW_TEST}.
* @param installerPackageName Optional package name of the application that is performing the
* installation. This identifies which market the package came from.
*/
public abstract void installPackage(
Uri packageURI, IPackageInstallObserver observer, int flags,
String installerPackageName);
PackageManager를 사용하여 APK 제거
/**
* Attempts to delete a package. Since this may take a little while, the result will
* be posted back to the given observer. A deletion will fail if the calling context
* lacks the {@link android.Manifest.permission#DELETE_PACKAGES} permission, if the
* named package cannot be found, or if the named package is a "system package".
* (TODO: include pointer to documentation on "system packages")
*
* @param packageName The name of the package to delete
* @param observer An observer callback to get notified when the package deletion is
* complete. {@link android.content.pm.IPackageDeleteObserver#packageDeleted(boolean)} will be
* called when that happens. observer may be null to indicate that no callback is desired.
* @param flags - possible values: {@link #DONT_DELETE_DATA}
*
* @hide
*/
public abstract void deletePackage(
String packageName, IPackageDeleteObserver observer, int flags);
차이점
인 텐트를 사용할 때 로컬 패키지 관리자는 설치가 시작된 응용 프로그램을 인식하지 못합니다. 특히 getInstallerPackageName (...)은 null을 반환합니다.
숨겨진 메소드 installPackage (...)는 설치 프로그램 패키지 이름을 매개 변수로 사용하며이 값을 설정할 수 있습니다.
질문
의도를 사용하여 패키지 설치 프로그램 이름을 지정할 수 있습니까? (설치 패키지의 이름을 설치 의도에 추가로 추가 할 수 있습니까?)
팁 : Android 소스 코드를 다운로드하려면 여기에 설명 된 단계를 수행하십시오. 소스 트리 다운로드. * .java 파일을 추출하여 패키지 계층 구조에 따라 폴더에 넣으려면 다음과 같은 깔끔한 스크립트를 확인할 수 있습니다 . Eclipse에서 Android 소스 코드보기 .