我编译的任何Android应用程序都要求获得一些权限,即使对于Hello World应用程序

时间:2016-06-21 06:31:03

标签: android android-permissions

创建只将Hello World放入TextView元素的Hello World应用程序时,应用程序会要求权限"读取手机状态和身份"和"修改和删除SD卡内容"。我无处可寻找(甚至递归遍历整个项目文件夹)对任一权限的任何引用。

有各种各样的线程,人们抱怨他们的应用程序请求随机权限,结果是一个库依赖项使用它。我不使用任何库。我的导入为android.app.Activityandroid.widget.TextViewandroid.os.Bundle。我的AndroidManifest.xml包含以下内容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="helloworld.test"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:label="@string/app_name">
        <activity android:name="helloactivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

注意没有<uses-permission ...libs文件夹为空; res文件夹恰好包含两个文件夹,每个文件夹都有一个xml文件:一个是布局(包含LinearLayoutTextView元素);另一个是values/strings.xml,其中包含应用程序的名称。

最后,我还检查了.apk文件并解码了二进制AndroidManifest.xml文件(它被编译为一些自定义二进制格式),它与原始文件相同。它在编译期间也不会添加任何内容。

我可以测试的所有设备都要求权限:两个Android 4.4设备和一个5.1设备。

编辑:再观察一下,听起来像这样:Why is my app asking for phone id permission?

我的目标是API级别19. ~~这可能是什么?~~编辑2:没关系,编译23级没有区别/编辑2.我真的很讨厌要求权限的应用程序他们不应该这样做。 (有着名的手电筒应用示例),但我当然希望它也可以在旧手机上运行。

在回应评论时,该项目不使用gradle而是使用ant。这是build.xml文件,删除了任何注释:

<?xml version="1.0" encoding="UTF-8"?>
    <project name="helloworld" default="help">
    <property file="local.properties" />
    <property file="ant.properties" />
    <property environment="env" />
    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
        <isset property="env.ANDROID_HOME" />
    </condition>
    <loadproperties srcFile="project.properties" />
    <fail message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable." unless="sdk.dir" />
    <import file="custom_rules.xml" optional="true" />
    <import file="${sdk.dir}/tools/ant/build.xml" />
</project>

最后是java代码:

package helloworld.test;

import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;

public class skeletonactivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView out = (TextView) findViewById(R.id.output);
        out.setText("Hello World.");
    }
}

1 个答案:

答案 0 :(得分:2)

原来是最重要的最小 sdk版本,甚至不是android create project生成的属性。它生成了一个project.properties文件,其中仅包含target=android-19(或我在create project命令中指定的任何目标)。

AndroidManifest.xml中你必须有这样一行:

    <uses-sdk android:minSdkVersion="19"/>

如果没有minSdkVersion,它将默认默认为版本1.此行位于<manifest ...>的正上方,因此<application>标记的之外。

对于这些特定权限,需要API级别4才能删除它们。使用minSdkVersion 3时,它仍然会要求权限。