Java 创建android unity3d插件棉花糖6.0

Java 创建android unity3d插件棉花糖6.0,java,android,shell,unity3d,android-6.0-marshmallow,Java,Android,Shell,Unity3d,Android 6.0 Marshmallow,您好,我目前正在尝试在Unity3D中构建所谓的android插件:NoodlePermissionGranter,这样我就可以在运行时请求危险的权限 我在stackoverflow的另一个问题上找到了插件 从主题中使用的答案:[ ] 我做了一些修改,使它更容易构建,但它没有按预期工作 如果插件还没有被授予权限,它应该请求一个危险的权限。 当尝试请求权限时,它会立即调用back to permission_DENIED 提前为我的英语不好道歉 编辑:无错误 NoodlePermissionGra

您好,我目前正在尝试在Unity3D中构建所谓的android插件:NoodlePermissionGranter,这样我就可以在运行时请求危险的权限

我在stackoverflow的另一个问题上找到了插件

从主题中使用的答案:[ ]

我做了一些修改,使它更容易构建,但它没有按预期工作

如果插件还没有被授予权限,它应该请求一个危险的权限。 当尝试请求权限时,它会立即调用back to permission_DENIED

提前为我的英语不好道歉

编辑:无错误

NoodlePermissionGranter.Java

编辑

Logcat


确保检查您的android清单是否具有危险权限


这就是我的问题。

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

那是我的问题

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);
        }
    }

}
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
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