Kotlin-互联网和位置权限问题

时间:2018-12-02 10:53:23

标签: android kotlin permissions location

我正在编写同时使用位置和互联网连接权限的android应用程序,并且正在平板电脑上运行它。如您所见,清单文件中都包含了这两个文件。问题在于,当在 MainActivity.kt 中的以下 if 调用OnConnected()函数时,计算结果为true,我无法继续进行该函数的操作。因此,您能否给我一些提示,以在不相关的情况下提供更多代码

AndroidManifest.xml:

(function() {
    var slideCount = document.querySelectorAll(".page-slider").length;
    console.log("slidecount", slideCount);
    var slider = document.getElementsByClassName("page-slider");
    var current = 0;

    function moveSlider(next) {
        slider[current].classList.remove("onscreen");
        slider[current].classList.add("offscreen-left");

        if (typeof next != "undefined") {
            current = next;
        } else {
            current++;
        }

        if (current >= slider.length) {
            current = 0;
        }
        // console.log("the new one is here " + current);

        slider[current].classList.add("onscreen");
    }

    setInterval(function() {
        moveSlider();
    }, 1000);
})();

MainActivity.kt

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

3 个答案:

答案 0 :(得分:0)

您必须了解Android中权限背后的逻辑。仅在清单中添加权限,并不意味着用户已授权应用程序执行这些权限启用的操作。

如果您的if条件评估为true,则由于未授予这些权限,因此您必须向用户询问这些权限。

Android对此有很好的documentation

我强烈建议您解决这个问题。

答案 1 :(得分:0)

您需要向用户请求许可并获得批准see this to request 您可以这样请求

ActivityCompat.requestPermissions(MainActivity.this,
                new String[]{Manifest.permission. ACCESS_FINE_LOCATION,Manifest.permission. ACCESS_COARSE_LOCATION},
                reqCode);

,您可以这样获得请求结果:

@Override
 public void onRequestPermissionsResult(int requestCode, String 
 permissions[], int[] grantResults) {
                switch (requestCode) {
                    case reqCode: {
        // If request is cancelled, the result arrays are empty.
                        if (grantResults.length > 0
                                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                            // permission was granted, yay! Do the
                            // contacts-related task you need to do.          
                        } else {
                            // permission denied, boo! Disable the
                            // functionality that depends on this permission.
                            Toast.makeText(MainActivity.this, "Permission denied", Toast.LENGTH_SHORT).show();
                        }
                        return;
                    }
                    // other 'case' lines to check for other
                    // permissions this app might request
                }
            }

答案 2 :(得分:0)

从Android 6.0及更高版本开始,需要请求权限,最好的方法是创建一个PermissionManager类来处理该权限,然后在用户的活动中检入用户是否已接受权限:

 class PermissionManager private constructor() {

   fun checkPermission(
    activity: Activity,
    permissionRequests: Array<String>?,
    requestCode: Int
): Boolean {

    permissionRequests?.let {
        it.firstOrNull {
            ContextCompat.checkSelfPermission(
                activity,
                it
            ) != PackageManager.PERMISSION_GRANTED
        }?.apply {
            ActivityCompat.requestPermissions(
                activity,
                permissionRequests,
                requestCode
            )
            return false
        }
    }
    return true
}

companion object {
    val instance by lazy { PermissionManager() }
    const val CAMERA_PERMISSION = 1
}

}

然后在您的活动中检查权限结果:

   class MainActivity : AppCompatActivity() {
       override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_ar)
    //If the user has the permission accepted the next times
        if (PermissionManager.instance.checkPermission(
            this, arrayOf(
                Manifest.permission.CAMERA
            ), PermissionManager.CAMERA_PERMISSION
        )
        ) {
            initLogic()
        }
    }
    override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    when (requestCode) {
        PermissionManager.CAMERA_PERMISSION -> {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                initLogic()
            } else {
                return
            }
        }
    }
 }
}
相关问题