我正在开发一个视频通话应用程序,我有一个“来电”屏幕,当有人调用他们时会提醒用户。此屏幕是由传入的 GCM 触发的 Activity ,并在 list 中设置了 noHistory="true"和 showOnLockScreen="true",以便用户无需解锁设备即可参与通话。
如果用户选择接听电话,我将启动另一个 Activity 以进行实际通话。但是,在启动第二个 Activity 之前,我会检查是否存在必要的权限(摄像头、麦克风等),如果没有则请求它们。
这就是问题所在。
问题 1:
系统显示的权限请求对话框导致我的 Activity 进入 onPause。我相信,因为在幕后这个对话实际上是一个 Activity 。
因为一个新的 Activity 在这里启动,使用 noHistory="true"意味着我们的 Activity 被立即杀死。从技术上讲,这是有意为之的行为,Android 团队确实已将此问题排除在外:
https://code.google.com/p/android-developer-preview/issues/detail?id=2915
我可以通过在 onPause 中手动管理它并检测是否有任何未完成的权限请求正在运行等来解决这个问题。
问题 2: 解决问题 1 后,我进入阶段 2。
现在请求权限时,我的 Activity 不再被终止,但设备只是返回到锁定屏幕,我没有看到权限对话框。
如果我随后解锁设备,万岁,我会看到我的 Activity 和请求权限对话框覆盖在顶部。这种用户体验是不愉快的。
视频在这里:https://youtu.be/cobINQ9e2GY
我猜测请求权限的 Activity 没有将 showOnLockScreen 属性设置为 true,因此如果它在屏幕锁定的情况下启动,它不会显示。
那么,一个大问题,我们能否从允许在锁定屏幕上显示的 Activity 中优雅地请求权限?
我的直觉是不,我们不能在不快速回到锁定屏幕的情况下显示权限对话框。但是,我可以接受的妥协是提示用户解锁设备/即显示 pin 输入屏幕。
那么,问题 2:
我们能否以编程方式从屏幕锁定时显示的 Activity 中显示 pin 解锁屏幕?
最佳答案
来自 requestPermission() (ActivityCompat) 的文档:
This method may start an activity allowing the user to choose which permissions to grant and which to reject. Hence, you should be prepared that your activity may be paused and resumed. Further, granting some permissions may require a restart of you application. In such a case, the system will recreate the activity stack before delivering the result to your onRequestPermissionsResult( int, String[], int[]).
我最终创建了一个状态变量来处理这个问题,这样 onPause() 和 onResume() 就可以区分是由于权限请求而被调用还是由于其他系统事件而被调用。
所以像这样:
private final int STATE_STARTING = 0;
private final int STATE_RUNNING = 1;
private final int STATE_REQUESTING_FINE_LOCATION_PERMISSION = 2;
private int state = STATE_STARTING;
@Override
public void onCreate() {
super.onCreate();
switch (state) {
case STATE_STARTING:
// do your initialization
state = STATE_RUNNING;
break;
}
}
@Override
public void onResume() {
super.onResume();
switch (state) {
case STATE_RUNNING:
// handle other system events
break;
case STATE_REQUESTING_FINE_LOCATION_PERMISSION:
// handle permission request event
break;
}
}
@Override
public void onPause() {
super.onPause();
switch (state) {
case STATE_RUNNING:
// handle other system events
break;
case STATE_REQUESTING_FINE_LOCATION_PERMISSION:
// handle permission request event
break;
}
}
private void someFunction() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
state = STATE_REQUESTING_FINE_LOCATION_PERMISSION;
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_PERMISSION_FINE_LOCATION);
} else {
doProcessingRequiringFineLocationPermission();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_PERMISSION_FINE_LOCATION:
if (grantResults != null && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
doProcessingRequiringFineLocationPermission();
}
state = STATE_RUNNING;
break;
}
}
关于android - 使用 noHistory ="true"和/或 showOnLockScreen ="true"从 Activity 请求 Android M 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35151233/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t