创建只将Hello World放入TextView元素的Hello World应用程序时,应用程序会要求权限"读取手机状态和身份"和"修改和删除SD卡内容"。我无处可寻找(甚至递归遍历整个项目文件夹)对任一权限的任何引用。
有各种各样的线程,人们抱怨他们的应用程序请求随机权限,结果是一个库依赖项使用它。我不使用任何库。我的导入为android.app.Activity
,android.widget.TextView
和android.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文件:一个是布局(包含LinearLayout
和TextView
元素);另一个是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.");
}
}
答案 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时,它仍然会要求权限。