Gibrid
Gibrid

Reputation: 137

MAUI Android 10 install APK programmatically

I am trying to install an .apk I have downloaded to the downloads folder in Android 10. I have tried this Xamarin Android 7+ install APK programmatically.

I gote this error:

Java.Lang.RuntimeException: 'Unable to get provider android.support.v4.content.FileProvider: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.content.FileProvider" on path: DexPathList[[zip file "/data/app/{PackName}-aV7Nkryw8OSTkpHc_8WmMg==/base.apk"],nativeLibraryDirectories=[/data/app/{PackName}-aV7Nkryw8OSTkpHc_8WmMg==/lib/arm64, /data/app/{PackName}-aV7Nkryw8OSTkpHc_8WmMg==/base.apk!/lib/arm64-v8a, /system/lib64, /product/lib64]]'

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="{PackName}">
    <application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true" android:label="{Label}">
        <provider android:name="android.support.v4.content.FileProvider" android:authorities="{PackName}.provider" android:exported="false" android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" />
        </provider>
    </application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
    <uses-sdk android:minSdkVersion="24"/>
</manifest>

provider_paths.xml

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

Code:

Context context = AndroidApp.Context;
var file = new Java.IO.File(fileUri);
if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
{
    var apkUri = FileProvider.GetUriForFile(context, context.ApplicationContext.PackageName + ".provider", file);
    Intent intentS = new Intent(Intent.ActionInstallPackage);
    intentS.SetData(apkUri);
    intentS.SetFlags(ActivityFlags.GrantReadUriPermission);
    context.StartActivity(intentS);
}

Upvotes: 2

Views: 1402

Answers (1)

Jessie Zhang -MSFT
Jessie Zhang -MSFT

Reputation: 13879

Since your target framework is set to Android 10 or later, and you are still using the old package, so you can try to change android.support.v4.FileProvider to androidx.core.content.FileProvider.

You can refer to the following code:

<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true">
        <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" />
</provider>

Upvotes: 1

Related Questions