繁体   English   中英

创建一个Android unity3d插件棉花糖6.0危险权限

[英]Creating a android unity3d plugin Marshmallow 6.0 dangerous permissions

嗨,我目前正在尝试在Unity3D中构建所谓的android plugin:NoodlePermissionGranter,以便可以在运行时请求危险的权限。

我在关于stackoverflow的另一个问题上找到了该插件。

从主题使用的答案:[ 在unity3d中实现Android 6.0权限 ]

我进行了一些更改,以使其易于构建,但无法正常工作。

如果尚未授予该插件,则应该请求危险的许可。 尝试请求权限时,它会立即回调到PERMISSION_DENIED。

预先为我的英语不好对不起。

编辑 :没有错误。

NoodlePermissionGranter.Java

package com.noodlecake.unityplugins;


      ///////////////////////////////////////////////////////////
     ///////////////// NoodlePermissionGranter /////////////////
    /// Implements runtime granting of Android permissions. ///
   /// This is necessary for Android M (6.0) and above. //////
  ///////////////////////////////////////////////////////////   
 //////////////////// Noodlecake Studios ///////////////////
///////////////////////////////////////////////////////////

import android.Manifest;
import android.os.Build;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.util.Log;
import android.content.pm.PackageManager;
import com.unity3d.player.UnityPlayer;

public class NoodlePermissionGranter
{
    // Only implements WRITE_EXTERNAL_STORAGE so far.
    // Implement the rest by matching the enum in NoodlePermissionGranter.cs
    // to the getPermissionStringFromEnumInt below.

    private final static String UNITY_CALLBACK_GAMEOBJECT_NAME = "NoodlePermissionGranter";
    private final static String UNITY_CALLBACK_METHOD_NAME = "permissionRequestCallbackInternal";
    private final static String PERMISSION_GRANTED = "PERMISSION_GRANTED"; // this will be an arg to the above method
    private final static String PERMISSION_DENIED = "PERMISSION_DENIED";

    public static String getPermissionStringFromEnumInt(int permissionEnum) throws Exception
    {
        switch (permissionEnum)
        {
            case 0:
                return Manifest.permission.WRITE_EXTERNAL_STORAGE;
            case 1:
                return Manifest.permission.READ_PHONE_STATE;
            case 2:
                return Manifest.permission.READ_EXTERNAL_STORAGE;
            // "and the rest is still unwritten" - Natasha Bedingfield
        }
        Log.e("NoodlePermissionGranter", "Error. Unknown permissionEnum " + permissionEnum);
        throw new Exception(String.format("Error. Unknown permissionEnum %d",permissionEnum));
    }

    public static void grantPermission(Activity currentActivity, int permissionEnum)
    {
        // permission enum must match ordering in NoodlePermissionGranter.cs
        final Activity act = currentActivity;
        Log.i("NoodlePermissionGranter","grantPermission " + permissionEnum) ;
        if (Build.VERSION.SDK_INT < 23) {
            Log.i("NoodlePermissionGranter","Build.VERSION.SDK_INT < 23 (" + Build.VERSION.SDK_INT+")");
            return;
        }

        try
        {
            final int PERMISSIONS_REQUEST_CODE = permissionEnum;
            final String permissionFromEnumInt = getPermissionStringFromEnumInt(permissionEnum);
            if (currentActivity.checkCallingOrSelfPermission(permissionFromEnumInt) == PackageManager.PERMISSION_GRANTED) {
                Log.i("NoodlePermissionGranter", "already granted");
                UnityPlayer.UnitySendMessage(UNITY_CALLBACK_GAMEOBJECT_NAME, UNITY_CALLBACK_METHOD_NAME, PERMISSION_GRANTED);
                return;
            }

            final FragmentManager fragmentManager = currentActivity.getFragmentManager();
            final Fragment request = new Fragment() {

                @Override public void onStart()
                {
                    super.onStart();
                    Log.i("NoodlePermissionGranter","fragment start");
                    String[] permissionsToRequest = new String [] {permissionFromEnumInt};
                    Log.i("NoodlePermissionGranter","fragment start " + permissionsToRequest[0]);
                    requestPermissions(permissionsToRequest, PERMISSIONS_REQUEST_CODE);
                }

                @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
                {
                    Log.i("NoodlePermissionGranter", "onRequestPermissionsResult");
                    if (requestCode != PERMISSIONS_REQUEST_CODE)
                        return;

                    if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        // permission was granted, yay! Do the
                        // contacts-related task you need to do.
                        Log.i("NoodlePermissionGranter", PERMISSION_GRANTED);
                        UnityPlayer.UnitySendMessage(UNITY_CALLBACK_GAMEOBJECT_NAME, UNITY_CALLBACK_METHOD_NAME, PERMISSION_GRANTED);
                    } else {

                        // permission denied, boo! Disable the
                        // functionality that depends on this permission.
                        Log.i("NoodlePermissionGranter",PERMISSION_DENIED);
                        UnityPlayer.UnitySendMessage(UNITY_CALLBACK_GAMEOBJECT_NAME, UNITY_CALLBACK_METHOD_NAME, PERMISSION_DENIED);
                    }


                    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                    fragmentTransaction.remove(this);
                    fragmentTransaction.commit();

                    // shouldBeOkayToStartTheApplicationNow();
                }
            };

            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.add(0, request);
            fragmentTransaction.commit();
        }
        catch(Exception error)
        {
            Log.w("[NoodlePermissionGranter]", String.format("Unable to request permission: %s", error.getMessage()));
            UnityPlayer.UnitySendMessage(UNITY_CALLBACK_GAMEOBJECT_NAME, UNITY_CALLBACK_METHOD_NAME, PERMISSION_DENIED);
        }
    }

}

NoodlePermissionGranter.sh

export JAVA_HOME=/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
ClASSPATH="classes.jar"

javac NoodlePermissionGranter.java -bootclasspath android.jar -classpath $ClASSPATH -d .
javap -s com.noodlecake.unityplugins.NoodlePermissionGranter
jar cvfM NoodlePermissionGranter.jar com/
rm -rf com
read -p "Press any key to continue... " -n1 -s

编辑

Logcat

04-01 16:13:44.656  5504  5518 I NoodlePermissionGranter: grantPermission 1
04-01 16:13:44.657  5504  5504 I NoodlePermissionGranter: fragment start
04-01 16:13:44.657  5504  5504 I NoodlePermissionGranter: fragment start android.permission.READ_PHONE_STATE
04-01 16:13:44.658  5504  5518 I NoodlePermissionGranter: grantPermission 0
04-01 16:13:44.659  5504  5518 I NoodlePermissionGranter: grantPermission 2
04-01 16:13:44.667  5504  5504 I NoodlePermissionGranter: fragment start
04-01 16:13:44.667  5504  5504 I NoodlePermissionGranter: fragment start android.permission.WRITE_EXTERNAL_STORAGE
04-01 16:13:44.675  5504  5504 I NoodlePermissionGranter: fragment start
04-01 16:13:44.675  5504  5504 I NoodlePermissionGranter: fragment start android.permission.READ_EXTERNAL_STORAGE
04-01 16:13:44.906  5504  5504 I NoodlePermissionGranter: onRequestPermissionsResult
04-01 16:13:44.907  5504  5504 I NoodlePermissionGranter: PERMISSION_DENIED
04-01 16:13:44.907  5504  5504 I NoodlePermissionGranter: onRequestPermissionsResult
04-01 16:13:44.907  5504  5504 I NoodlePermissionGranter: PERMISSION_DENIED
04-01 16:13:44.907  5504  5504 I NoodlePermissionGranter: onRequestPermissionsResult
04-01 16:13:44.907  5504  5504 I NoodlePermissionGranter: PERMISSION_DENIED

请务必检查您的android清单是否具有危险权限!

那是我的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM