Как преобразовать Uri.fromfile в FileProvider.getUriForFile в Unity?

У меня есть код из this кода ответа в единстве для установки apk, но он не работает в Android 7.0, потому что Uri.fromfile нет больше не поддерживается, и теперь следует использовать FileProvider.getUriForFile.

Я попытался открыть проект в студии Android и следовал этому руководству, чтобы управлять файлом манифеста - https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en

        AndroidJavaClass intentObj = new 
        AndroidJavaClass("android.content.Intent");
        string ACTION_VIEW = intentObj.GetStatic<string>("ACTION_VIEW");
        int FLAG_ACTIVITY_NEW_TASK = intentObj.GetStatic<int>
        ("FLAG_ACTIVITY_NEW_TASK");
        AndroidJavaObject intent = new 
        AndroidJavaObject("android.content.Intent", ACTION_VIEW);

        AndroidJavaObject fileObj = new AndroidJavaObject("java.io.File", 
        apkPath);
        AndroidJavaClass uriObj = new AndroidJavaClass("android.net.Uri");
        AndroidJavaObject uri = uriObj.CallStatic<AndroidJavaObject>
        ("fromFile", fileObj);

        intent.Call<AndroidJavaObject>("setDataAndType", uri, 
        "application/vnd.android.package-archive");
        intent.Call<AndroidJavaObject>("addFlags", FLAG_ACTIVITY_NEW_TASK);
        intent.Call<AndroidJavaObject>("setClassName", 
        "com.android.packageinstaller", 
        "com.android.packageinstaller.PackageInstallerActivity");

        AndroidJavaClass unityPlayer = new 
        AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = 
        unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        currentActivity.Call("startActivity", intent);

person Mazhar    schedule 12.07.2017    source источник


Ответы (1)


Просто замените

AndroidJavaObject fileObj = new AndroidJavaObject("java.io.File", apkPath);
AndroidJavaClass uriObj = new AndroidJavaClass("android.net.Uri");
AndroidJavaObject uri = uriObj.CallStatic<AndroidJavaObject>("fromFile", fileObj);

с

AndroidJavaObject fileObj = new AndroidJavaObject("java.io.File", apkPath);
AndroidJavaClass fileProvider = new AndroidJavaClass("android.support.v4.content.FileProvider");
AndroidJavaObject uri = fileProvider.CallStatic<AndroidJavaObject>("getUriForFile", unityContext, authority, fileObj);

Параметр authority состоит из:

string packageName = unityContext.Call<string>("getPackageName");
string authority = packageName + ".fileprovider";

Затем добавьте разрешение FLAG_GRANT_READ_URI_PERMISSION к намерению перед вызовом функции currentActivity.Call.

intent.Call<AndroidJavaObject>("addFlags", FLAG_GRANT_READ_URI_PERMISSION);

Полный сценарий см. в отредактированном вопросе Как установить Android apk из приложения Unity.

person Programmer    schedule 17.07.2017