2016-09-14 19 views
0

我正在构建一个应用程序,我正在使用位置。我已经宣布在明显的权限:当我在Manifest中拥有位置权限并且为什么出现此警报对话框错误时,是否需要用于访问位置的警报对话框?

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

我现在就需要作出警告对话框,使用户能够准许他的位置的设备上,或者我已经做到了与清单此权限吗? 当我为开启GPS上我得到这个错误对话框:

09-14 12:18:12.614 28114-28114/com.telnet.asp E/WindowManager: Activity com.telnet.asp.presentation.view.activities.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{42b29910 V.E..... R.....ID 0,0-720,351} that was originally added here 
                   android.view.WindowLeaked: Activity com.telnet.asp.presentation.view.activities.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{42b29910 V.E..... R.....ID 0,0-720,351} that was originally added here 
                    at android.view.ViewRootImpl.<init>(ViewRootImpl.java) 
                    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java) 
                    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java) 
                    at android.app.Dialog.show(Dialog.java) 
                    at com.telnet.asp.presentation.view.activities.MainActivity.showDialogForAllowingLocation(MainActivity.java:380) 
                    at com.telnet.asp.presentation.view.activities.MainActivity.onCreate(MainActivity.java:63) 
                    at android.app.Activity.performCreate(Activity.java) 
                    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java) 
                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java) 
                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java) 
                    at android.app.ActivityThread.access$700(ActivityThread.java) 
                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java) 
                    at android.os.Handler.dispatchMessage(Handler.java) 
                    at android.os.Looper.loop(Looper.java) 
                    at android.app.ActivityThread.main(ActivityThread.java) 
                    at java.lang.reflect.Method.invokeNative(Native Method) 
                    at java.lang.reflect.Method.invoke(Method.java:525) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java) 
                    at dalvik.system.NativeStart.main(Native Method) 

这是我的警告对话框:

private void showDialogForAllowingLocation() { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setCancelable(false); 
     builder.setTitle(getResources().getString(R.string.enable_permission)); 
     builder.setMessage(getResources().getString(R.string.enable_access)); 
     builder.setInverseBackgroundForced(true); 
     builder.setPositiveButton(getResources().getString(R.string.enable), new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       startActivity(
         new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS)); 
      } 
     }); 
     builder.setNegativeButton(getResources().getString(R.string.ignore), new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.dismiss(); 
      } 
     }); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
    } 
    private void EnableGPSIfPossible() { 
     final LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
      showDialogForAllowingLocation(); 
     } 
    } 

哪里是我的错?

+0

您必须添加对话框,提示用户对GPS如果手机GPS关闭。 –

+0

请参阅编辑的问题。 – Atenica

+0

是的,如果targetSdkVersion i等于或大于23,并且手机使用Android M或更高版本 - 请点击此处查看 - https://inthecheesefactory.com/blog/things-you-need-to-know-about -android-m-permission-developer-edition/en - 否则,当您在Android M下面下载低于23的应用程序时,它会要求您在安装应用程序之前授予许可权 – Tasos

回答

0

是的。这确保您的应用程序不会中断运行。在应用程序启动之前检查互联网连接和gps。

0

您需要检查用户是否打开了GPS,如果没有,那么您必须显示提示对话框。

但是,请注意,从Android 6.0(API 23)开始,您必须手动要求用户授予权限,因为ACCESS_FINE_LOCATION被归类为危险。在权限组此处了解详情:https://developer.android.com/guide/topics/security/permissions.html

0

Yes you need to runtime permission for Android 6.0 or greater follow that

private static final int REQUEST_RUNTIME_PERMISSION = 123; 


    if (CheckPermission(demo.this, Manifest.permission.ACCESS_FINE_LOCATION)) { 


     showDialogForAllowingLocation(); 

    } else { 
     // you do not have permission go request runtime permissions 
     RequestPermission(demo.this, Manifest.permission.ACCESS_FINE_LOCATION, REQUEST_RUNTIME_PERMISSION); 
    } 



public void RequestPermission(Activity thisActivity, String Permission, int Code) { 
     if (ContextCompat.checkSelfPermission(thisActivity, 
       Permission) 
       != PackageManager.PERMISSION_GRANTED) { 
      if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
        Permission)) { 
       showDialogForAllowingLocation(); 

      } else { 
       ActivityCompat.requestPermissions(thisActivity, 
         new String[]{Permission}, 
         Code); 
      } 
     } 
    } 

    public boolean CheckPermission(Activity context, String Permission) { 
     if (ContextCompat.checkSelfPermission(context, 
       Permission) == PackageManager.PERMISSION_GRANTED) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
0

使用许可专为android version > L

if (ActivityCompat.checkSelfPermission 
       (this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED 
       && 
       ActivityCompat.checkSelfPermission 
         (this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
     { 
      requestPermissions(new String[]{ 
        Manifest.permission.ACCESS_COARSE_LOCATION, 
        Manifest.permission.ACCESS_FINE_LOCATION 
      }, 1); 

     } 

权限处理:

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
switch (requestCode) { 

    case 1: 
     if (grantResults[0] != PackageManager.PERMISSION_GRANTED){ 
      //do something 
     } 
    default: 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
} 
}