标签: android-6.0-marshmallow

Android M请求权限非活动

我的小部件调用Activity范围之外的安全权限.可以在Android之外请求Android M的权限Activity吗?

android android-6.0-marshmallow

37
推荐指数
2
解决办法
2万
查看次数

从服务Android M请求位置权限

我正在使用启动时启动并开始检查位置更新的服务.一旦我拒绝在权限弹出窗口上进行位置访问,感谢Android M我的服务在手机启动后崩溃了.

因为我已经没有活动在这种情况下,调用requestPermissions()返回一个ClassCastException作为我的服务Context能不能被转换为一个活动.

我的方法调用:

ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_COARSE_LOCATION);
Run Code Online (Sandbox Code Playgroud)

到目前为止是否有任何解决方案或者我是否必须撤销服务权限以免在这种状态下运行.

android android-permissions android-6.0-marshmallow

37
推荐指数
2
解决办法
4万
查看次数

什么是com.google.android.gms.persistent,为什么总是使用CPU?

即使没有其他任何事情发生,这个系统进程似乎使用稳定的1-2%的CPU.在一天的过程中,即使设备没有用于任何东西,也会耗尽大量的电池.我无法将其与任何其他应用程序相关联,因为即使他们在几个小时的过程中仅使用了几秒的CPU时间,此过程也会使用分钟.

即使我:它似乎仍然运行:

  • 关掉WiFi
  • 关闭蓝牙
  • 关闭位置服务
  • 关闭除了最简单的同步之外的所有内容(例如GMail)

我写了一个小测试应用程序,/proc/<pid>/stat每隔10毫秒监视一次,并随时写入logcat com.google.android.gms.persistent,希望它会写入logcat本身的内容,这将确定哪些应用程序或其他服务正在使用"持久"服务.我看不多,但这里有一些我看到过的东西:

InputReader: Reconfiguring input devices.  changes=0x00000010
WifiService: acquireWifiLockLocked: WifiLock{NlpWifiLock type=2 binder=android.os.BinderProxy@f73f0b8}
LocationFilter: Forcing stable location. Original location:Location[...
ConnectivityService: notifyType CAP_CHANGED for NetworkAgentInfo [WIFI () - 246]
Run Code Online (Sandbox Code Playgroud)

上面的每一行都是在不同的时间,紧接在检测CPU使用情况的日志消息之前(在10ms内)com.google.android.gms.persistent但没有任何明确指示它是否相关.不幸的是,上述情况都没有报告超过10ms的CPU时间,因此 - 即使准确表示使用"持久"的内容仅代表实际CPU时间的一小部分.

研究使用这个过程的其他尝试已经提出了我没有并且从未连接到我的设备的各种东西(例如可穿戴设备).

什么在使用这个过程?我正在寻找这些信息,或者我可以通过其他方式推断出类似于我通过logcat尝试的信息.

更新:我一直在https://android.googlesource.com上寻找源(例如com.google.android.gms.persistent.java或类似的东西),没有任何运气.这不是公共源代码的一部分吗?什么是真正奇怪的是,有甚至没有出现任何文件,如这里:https://android.googlesource.com/platform/frameworks/base/+/33fca8e/docs/html/reference/com/google/安卓/克

更新2:我在"设置" - >"帐户"下禁用了所有同步.这似乎可以减少CPU的使用量,并且电池掉落似乎已经下降到爬行 - 除了定期com.google.android.gms.persistent似乎仍然需要一点CPU.

我现在的工作理论是,无论是否需要,它都会以大约60秒的间隔发出警报,并且该代码正在检查同步工作,如果不需要同步,它会放弃正确的时间片离开,让CPU正常睡觉.然而,我中途不敢相信会使用这么糟糕的设计,因为每分钟唤醒CPU的任何事情都会使电池耗尽更快,即使它只是重新入睡,为什么会使用轮询而不是中断驱动同步的东西?

据我所知(由于无法找到它),com.google.android.gms.persistent的源代码不是开源的,也不是在线提供的.如果我错了,我会接受作为我的问题的答案,任何指向源代码的答案,因为我可以浏览它并自己确定CPU使用的原因.

android android-6.0-marshmallow

37
推荐指数
0
解决办法
8万
查看次数

Android 6.0权限.GET_ACCOUNTS

我用它来获得许可:

if (ContextCompat.checkSelfPermission(context, Manifest.permission.GET_ACCOUNTS) != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(context, Manifest.permission.GET_ACCOUNTS)) {

    } else {
        // No explanation needed, we can request the permission.
        ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.GET_ACCOUNTS}, PERMISSIONS_REQUEST_GET_ACCOUNTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}
Run Code Online (Sandbox Code Playgroud)

但是权限的弹出对话框要求用户访问联系人!?!?

在Play商店的6.0之前

<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
Run Code Online (Sandbox Code Playgroud)

请求被命名为Identity并解释我需要它来获取设备帐户.

permissions android android-6.0-marshmallow

35
推荐指数
3
解决办法
4万
查看次数

应用程序链接无法在Android上运行

我的应用程序定义了意图过滤器来处理来自我的网站定义的URL

<intent-filter android:autoVerify="true">
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:host="www.host.com" android:scheme="http"/>
</intent-filter>
<intent-filter android:autoVerify="true">
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
  <data android:host="www.host.com" android:scheme="https"/>
</intent-filter>
Run Code Online (Sandbox Code Playgroud)

该应用程序正确检测正确主机的URL,但查询用户是否在应用程序或浏览器中打开它们.我尝试使用此处指定的应用链接验证.https://developer.android.com/training/app-links/index.html

如我的服务器日志中所示,安装后,应用程序设备会查询/well-known/assetlinks.json,并以200状态响应.使用.测试数字资产文件

https:// digitalassetlinks.googleapis.com/v1/statements:list?source.web.site= https:// <domain1>:<port>&relation = delegate_permission/common.handle_all_urls

API并没有发现任何错误.

使用了获得assetlinks.json文件中的SHA256

keytool -list -v -keystore my-release-key.keystore 
Run Code Online (Sandbox Code Playgroud)

应用程序签名的.keystore.

运行https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://<domain1>:<port>&relation=delegate_permission/common.handle_all_urls返回链接验证状态为"ask",表示验证失败.为什么验证会失败?

android applinks android-6.0-marshmallow

35
推荐指数
6
解决办法
8675
查看次数

如何测试Android 6.0完全备份行为?

TL; DR:你如何成功地使用命令行工具(或其他任何东西)来测试Android 6.0备份和恢复行为,因为我无法让它们恢复任何东西?


由于我早些时候遇到了问题,我的书中有一个示例应用程序试图让这个工作,我从头开始为了这个问题的目的.

我从Android Studio 1.4.1新项目向导创建了一个全新的项目,接受所有相关的默认设置,除了我使用"空活动"模板并添加了2应用程序ID和显示名称.然后我在活动中添加了一些代码,以便为我提供有关内部存储的一些数据:

package com.commonsware.myapplication2;

import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    PreferenceManager
      .getDefaultSharedPreferences(this)
      .edit()
      .putBoolean("foo", true)
      .apply();
  }
}
Run Code Online (Sandbox Code Playgroud)

我运行应用程序并确认,使用adb shell run-as com.commonsware.myapplication2 ...SharedPreferences文件存在.

然后我adb shell setprop log.tag.BackupXmlParserLogging VERBOSE根据文档跑了.没有明显的问题.

然后我adb shell bmgr run按照文档运行,它生成了大量的日志消息,但没有任何与我的应用程序有关的内容(正如预期的那样)(并且也没有暗示备份引擎的任何特殊问题).

然后我adb shell bmgr fullbackup com.commonsware.myapplication2根据文档运行,生成:

11-16 15:09:15.246 10372-10372/? D/AndroidRuntime: Calling main entry com.android.commands.bmgr.Bmgr
11-16 15:09:15.248 …
Run Code Online (Sandbox Code Playgroud)

android android-backup-service android-6.0-marshmallow

33
推荐指数
1
解决办法
3417
查看次数

Android 6.0 Marshmallow BLE:连接参数

在Android 6中,蓝牙低功耗连接参数管理似乎已经发生了变化.

我有一个BLE外围设备需要使用一些特定的连接参数(特别是连接间隔),我想使用BLE规范允许的最小连接间隔(即7,5ms).

Android SDK不允许从BLE GAP Central(智能手机)端选择它,因此正确的方法是让我的GAP外围设备L2CAP Connection Parameter Update Request在建立GAP连接后发送.

我要求的参数是:

  • conn interval min:7,5ms
  • conn interval max:7,5ms
  • 奴隶潜伏期:0
  • 监督超时:2000ms

这与我一直在测试的所有Android设备一样工作,从4.3到5.x:发送后L2CAP Connection Parameter Update Request,我的设备收到一个L2CAP Connection Parameter Update Response0x0000(接受),然后LE Connection Update Complete event我可以看到所请求的连接参数已经很好了考虑到了.

现在,使用Nexus 9平板电脑或2个不同的Nexus 5设备,都拥有Android 6.0.1,我可以看到它L2CAP Connection Parameter Update Request总是被拒绝(我收到的是L2CAP Connection Parameter Update Response0x0001(拒绝)).然后我收到一个LE Connection Update Complete event我可以看到所请求的连接参数未被考虑的地方.

我一直在尝试使用外设方面的两种不同的实现(一种是使用ST Microelectronics的BlueNRG,一种是使用Nordic Semiconductor的nRF52),两者的结果完全相同.

然后,经过更多的测试:我尝试了不同的参数集,更改了conn interval max(我保持其他参数相同).这是我发现的:

  • 如果conn interval max = 18.75ms,则接受更新请求,间隔设置为18.75ms
  • 如果conn interval max = 17.50ms,则接受更新请求,间隔设置为15.00ms
  • 如果conn …

android bluetooth bluetooth-lowenergy android-bluetooth android-6.0-marshmallow

32
推荐指数
2
解决办法
2万
查看次数

如何以编程方式在应用设置中打开应用程序权限窗口

我正在研究新的权限模型(Android 6.0 Marshmallow),我想知道有没有办法以编程方式打开应用程序的权限窗口?

应用权限

不仅是申请细节

应用设置

我设法用这样的东西打开第二个屏幕

private void goToSettings() {
    Intent myAppSettings = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + getPackageName()));
    myAppSettings.addCategory(Intent.CATEGORY_DEFAULT);
    myAppSettings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(myAppSettings);
}
Run Code Online (Sandbox Code Playgroud)

但我不知道如何打开第一个.

非常感谢您的帮助:)

permissions android android-settings android-6.0-marshmallow

32
推荐指数
1
解决办法
2万
查看次数

活动没叫完?(API 23)

我收到以下错误,我不知道为什么会发生这种情况.

错误:

08-23 17:07:46.533  22454-22454/com.a.b.c E/AndroidRuntime? FATAL EXCEPTION: main
    Process: com.a.b.c, PID: 22454
    java.lang.RuntimeException: Unable to resume activity {com.a.b.c/com.a.b.c.MainActivity}: java.lang.IllegalStateException: Activity {com.a.b.c/com.a.b.c.MainActivity} did not call finish() prior to onResume() completing
            at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3103)
            at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
            at android.app.ActivityThread.-wrap11(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.IllegalStateException: Activity {com.a.b.c/com.a.b.c.MainActivity} did not call finish() prior to onResume() completing
            at android.app.Activity.performResume(Activity.java:6324)
            at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3092)
            at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
            at android.app.ActivityThread.-wrap11(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
            at android.os.Handler.dispatchMessage(Handler.java:102) …
Run Code Online (Sandbox Code Playgroud)

android runtime-error android-lifecycle android-6.0-marshmallow

31
推荐指数
5
解决办法
1万
查看次数

FileObserver不适用于Android 6.0 Marshmallow(API 23)中的外部存储

我有一个应用程序,用于观察外部存储上的公共目录FileObserver.它在Lollipop设备上运行良好.我想添加支持Marshmallow,所以我用它设置了一个Nexus 9平板电脑.

在Marshmallow设备上,它失败了,在Lollipop设备上它没关系.在Marshmallow设备上,FileObserver它不会对由其他进程引起的文件系统事件做出反应.例如,截取屏幕截图,通过adbshell 创建文件.如果文件是由我的应用程序创建的,它可以正常工作.

Marshmallow,我要求WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE权限Manifest.xml.

当我用API 23编译时,我也确保我打电话ActivityCompat.requestPermissions().

当我用API 22编译时,我只是依靠Manifest.xml.

如果我观察它的话,它会起作用/data/data/my-package-name.

如果我观察到它,它就会失败/storage/emulated/0/Pictures/Screenshots.

是否有人测试FileObserver了以下所有内容?:

  • Marshmallow 设备
  • API 23和API 22?
  • 外部存储
  • 由观察应用程序之外的其他进程创建的文件(例如adb或截屏).

java android adb fileobserver android-6.0-marshmallow

31
推荐指数
1
解决办法
3478
查看次数