Aaron Thompson
Aaron Thompson

Reputation: 1889

Xamarin Android 7+ install APK programmatically

I am trying to install an .apk I have downloaded to the downloads folder in Android 7.

I have tried the way recommended in a number of StackOverflow posts and here https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en by using a FileProvider:

File file = new File(fileUri);
//using Android.Support.V4.Content;
var downloadUri = FileProvider.GetUriForFile(context,context.ApplicationContext.PackageName + ".com.package.name.provider", file);
Intent install = new Intent(Intent.ActionInstallPackage);
install.AddFlags(ActivityFlags.GrantReadUriPermission);
install.AddFlags(ActivityFlags.GrantWriteUriPermission);
install.AddFlags(ActivityFlags.GrantPersistableUriPermission);
install.SetDataAndType(downloadUri, "application/vnd.android.package-archive");
context.StartActivity(install);

AndroidManifest.xml

<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<application android:label="Settings" android:icon="@drawable/Icon" android:theme="@style/myTheme">
    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.com.package.name.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>
</application>

provider_paths.xml

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="." /> 
</paths>

The "downloadUri" looks like: "content://com.package.name.com.package.name.provider/external_files/Download/Sensors%2520Multitool_1.3.0_apk-dl.com.apk"

The error when the installation window pops up is: "There was a problem parsing the package".

I have installed this package by clicking on it in the downloads folder and it installs fine, I have also tried other .apk's with the same issue.

Upvotes: 8

Views: 6759

Answers (2)

Aaron Thompson
Aaron Thompson

Reputation: 1889

It appears that the issue in parsing the package was due to the space in the package name "Sensors%2520Multitool_1.3.0_apk-dl.com.apk".

As soon as the space was removed the package installed correctly.

Upvotes: 1

h.ghanbari
h.ghanbari

Reputation: 61

File file = new File(fileUri);
if(Build.VERSION.SdkInt >= Build.VERSION_CODES.N) {
    Uri apkUri = FileProvider.GetUriForFile(context, context.ApplicationContext.PackageName + ".provider", toInstall);
    Intent intentS = new Intent(Intent.ActionInstallPackage);
    intentS.SetData(apkUri);
    intentS.SetFlags(ActivityFlags.GrantReadUriPermission);
    context.StartActivity(intentS);
} else {
    Uri apkUri = Uri.FromFile(toInstall);
    Intent intentS = new Intent(Intent.ActionView);
    intentS.SetDataAndType(apkUri, "application/vnd.android.package-archive");
    intentS.SetFlags(ActivityFlags.NewTask);
    context.StartActivity(intentS);
}

Upvotes: 6

Related Questions