2

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);
}
Gibrid
  • 25
  • 4
  • `android.support.v4` is the package name of the old deprecated Android support library which has been replaced with `androidx`. If you use AndroidX library in your project please see https://stackoverflow.com/questions/48534293/android-support-v4-content-fileprovider-not-found – Robert Oct 24 '22 at 11:55

1 Answers1

1

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>
Jessie Zhang -MSFT
  • 9,830
  • 1
  • 7
  • 19