gpt4 book ai didi

android - targetSdkVersion 23 通过 accountManager.getAccounts() 返回 0 长度数组

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:09:01 25 4
gpt4 key购买 nike

我在我的真实 Nexus 5 设备 Android 6.0.1 中观察到以下奇怪的结果

我在应用启动期间运行了以下简单代码。

Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
AccountManager accountManager = AccountManager.get(this);
Account[] accounts = accountManager.getAccounts();

如果我将 targetSdkVersion 设置为 22、21、19,上面的代码工作正常。它返回非空数组。

但是,当我更改 targetSdkVersion 并进行测试时

defaultConfig {
applicationId "org.yccheok.myapplication"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
}

以上代码返回长度为0的数组!

知道为什么在针对 targetSdkVersion=23 编译时会出现问题。

请注意,在产生问题的过程中,每当您更改targetSdkVersion并通过Android Studio运行它时,您都需要清除您的应用数据,清除您的应用缓存并为所有用户卸载手动。

以下是在 Nexus 5 设备、Android 6.0.1 中重现问题的步骤

  1. 通过文件 -> 新建 -> 新建项目在 Android Studio 中创建项目...
  2. 选择“空白 Activity ”

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.yccheok.myapplication">

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

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

build.gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.1"

defaultConfig {
applicationId "org.yccheok.myapplication"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
}

主 Activity .java

import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Patterns;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

import java.util.regex.Pattern;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});

int targetSdkVersion = 0;
try {
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
targetSdkVersion = packageInfo.applicationInfo.targetSdkVersion;
}
catch (PackageManager.NameNotFoundException e) {
android.util.Log.i("CHEOK", e.getMessage());
}

Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
AccountManager accountManager = AccountManager.get(this);
Account[] accounts = accountManager.getAccounts();

android.util.Log.i("CHEOK", targetSdkVersion + " : numnber of accoutn by ??? = " + accounts.length);

for (Account account : accounts) {
if (emailPattern.matcher(account.name).matches()) {
String possibleEmail = account.name;
android.util.Log.i("CHEOK", "possibleEmail = " + possibleEmail);
}
}

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}

知道为什么 targetSdkVersion 23 通过 accountManager.getAccounts() 返回 0 长度数组

最佳答案

GET_ACCOUNTS 是一个 dangerous permission当使用目标 sdk 23 时需要使用 runtime permissions 进行管理否则它将不起作用。

您实际上需要 request permission在运行时来自用户。示例:

      ActivityCompat.requestPermissions(this, new String[] 
{Manifest.permission.GET_ACCOUNTS}, 1);

int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.GET_ACCOUNTS);

我在 this answer here 中对此进行了详细介绍.

Dangerous permissions cover areas where the app wants data or resources that involve the user's private information, or could potentially affect the user's stored data or the operation of other apps. For example, the ability to read the user's contacts is a dangerous permission. If an app declares that it needs a dangerous permission, the user has to explicitly grant the permission to the app.

关于android - targetSdkVersion 23 通过 accountManager.getAccounts() 返回 0 长度数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34561188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com