【问题标题】:Unable to add Android manifest Permissions无法添加 Android 清单权限
【发布时间】:2014-06-06 12:28:00
【问题描述】:

我在一个 android 库项目上工作了数周,到目前为止没有任何问题。 但现在我实现了一些代码来检查网络状态,如下所示:

public Boolean getCurrentNetworkStatus(Activity activity) {
    ConnectivityManager cm;
    NetworkInfo netInfo = null;

    try {
         cm = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);          
         netInfo = cm.getActiveNetworkInfo();
    } catch (Exception e) {
        Log.d("MOCK", e);
    } 

    if(netInfo != null && netInfo.isConnected()) {
        return True;
    } 

    return False;
}

我的 log.d 给出了我缺少 ACCES_NETWORK_STATE 权限的错误。这是麻烦开始的地方..

打开我的 Manifest.xml 时,我无法添加权限(已经有 3 个其他权限)。当我单击添加时,它会显示一个空窗口:在顶层创建一个新元素,由于缺少描述符而在临时描述符中。

尝试仅向清单添加权限不起作用。代码没有抱怨,只是说我仍然缺少权限。

除此之外,Manifest.xml 开始给我警告:应该明确设置 android:icon,没有默认值。但是在图书馆项目上工作我不需要图标。 (也从来不需要)。

我的清单:

<?xml version="1.0" encoding="utf-8"?>
  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="nl.test.projectInternet"
    android:versionCode="1"
    android:versionName="1.0">
<uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="19" />
<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"/>
<application
    android:label="projectInternet"
    android:allowBackup="false">
    <activity android:name=".projectInternet"
              android:label="projectInternet">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
 </application> </manifest>

收到的确切异常是:用户 10021 和当前进程都没有 android.permission.ACCES_NETWORK_STATE。

任何人都知道我做错了什么/应该做些什么来解决这个问题?

请记住:代码在其他 android 项目上正常运行。现在我正在开发一个图书馆,但我无法添加权限!简单地将其添加到 .xml 是行不通的。

【问题讨论】:

  • 你能发布你的AndroidManifest.xml的内容吗?
  • 添加此权限并清理项目
  • 已经说过:尝试将权限添加到清单中不起作用。代码没有抱怨,只是说我仍然缺少权限。
  • 您是否缺少结束 标记,或者只是复制错误?清单中的一些拼写错误也可能导致奇怪的行为。
  • 是的,复制一份,将错误从代码粘贴到 stackoverflow

标签: android permissions android-activity manifest


【解决方案1】:

你可以关注我。一步一步:比如

首先在 AndroidMenifest.xml 文件中添加权限。

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

第二次添加 CheckInternet 类

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class CheckInternet 
{
    public static boolean checkConn(Context ctx)
    {
        ConnectivityManager conMgr =  (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = conMgr.getActiveNetworkInfo();
        if (info == null)
            return false;
          if (!info.isConnected())
            return false;
          if (!info.isAvailable())
            return false;
          return true;


    }


}

最后从您的活动中检查互联网。比如

    if (CheckInternet.checkConn(getBaseContext())) {
                // internet connect ok
            } else {
// internet connection not ok
}

【讨论】:

  • 我无法使用 getBaseContext() 调用。它不存在。
  • 你的 Skype id 给我,omor4android 我的 Skype id
  • 假设从 MainActivity.Class 检查互联网权限,那么您将使用 MainActivity.this 而不是 getBaseContext() 。好的
【解决方案2】:

将此权限添加到您的清单中 Access_corse_location 旁边。

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

用以下方法替换您的方法来检查连接:

/**
 * Checking internet state
 * @param context
 * @return true if internet is enabled
 * else 
 * false
 */
public static boolean checkNetConnection(Context context){

    ConnectivityManager miManager=(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo miInfo=miManager.getActiveNetworkInfo();
    if(miInfo!=null && miInfo.getType() == ConnectivityManager.TYPE_WIFI){
        return true;
    }
    else if(miInfo!=null && miInfo.getType() == ConnectivityManager.TYPE_MOBILE){
        return true;
    }
    else if(miInfo!=null &&  miInfo.isConnectedOrConnecting()){

        return true;
    }else{

        return false;
    }
}

然后清理并构建您的项目,然后运行它。它不会抛出任何错误。

【讨论】:

  • 您所需要的只是您的活动或服务类的上下文。只需使用以下方法调用此方法 if( checkNetConnection(this) ) { // 有网络连接} else // 无连接。
【解决方案3】:
       import android.content.Context;
       import android.net.ConnectivityManager;
       import android.net.NetworkInfo;

       public class InternetConnection {

       private Context _context;

       public InternetConnection(Context context){
       this._context = context;
     }

       public boolean isConnectingToInternet(){
       ConnectivityManager connectivity = (ConnectivityManager)  
       _context.getSystemService(Context.CONNECTIVITY_SERVICE);
      if (connectivity != null)
      {
          NetworkInfo[] info = connectivity.getAllNetworkInfo();
          if (info != null)
              for (int i = 0; i < info.length; i++)
                  if (info[i].getState() == NetworkInfo.State.CONNECTED)
                  {
                      return true;
                  }

      }
      return false;
      }
      }

在清单中

     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission 
      android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


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

试试这个。

【讨论】:

  • 获取空指针异常。但请记住,代码不是问题。清单不允许添加权限的事实是..
【解决方案4】:

如果你在 OS > 6.0 上运行,试试这个:

来自活动调用 verifyInetPermissions(this);

private static final int REQUEST_INET = 1;
private static String[] PERMISSIONS_INET = {
        Manifest.permission.ACCESS_NETWORK_STATE,
        Manifest.permission.INTERNET
};

public static void verifyInetPermissions(Activity activity) {
    // Check if we have Inet permission
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_NETWORK_STATE);
    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We don't have permission so prompt the user
        ActivityCompat.requestPermissions(activity, PERMISSIONS_INET, REQUEST_INET );
    }
}

我还看到你漏掉了一个字母 S,不是 ACCES_NETWORK_STATE,而是 ACCESS_NETWORK_STATE。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多