根据Google的说法,当谈到M Developer Preview运行时权限时:
如果您之前从未要求过某种许可,那就请求它
如果您之前询问过,并且用户说"不",然后用户尝试执行需要被拒绝权限的操作,则应该在再次请求权限之前提示用户解释您需要权限的原因
如果您之前曾多次询问,并且用户已经说"不,并且停止询问"(通过运行时权限对话框上的复选框),您应该停止打扰(例如,禁用需要权限的UI)
但是,我们只有一个方法,shouldShowRequestPermissionRationale()返回a boolean,我们有三个状态.我们需要一种方法来区分从未问过的状态和停止询问状态,就像我们false从shouldShowRequestPermissionRationale()两者中得到的那样.
对于首次运行应用程序时请求的权限,这不是一个大问题.有很多方法可以确定这可能是您的应用程序的第一次运行(例如,boolean值SharedPreferences),因此您假设如果它是您的应用程序的第一次运行,那么您处于从未问过的状态.
但是,运行时权限的一部分愿景是您可能不会事先要求所有这些权限.当用户点击需要该权限的内容时,您可能仅在稍后要求的边缘功能上绑定权限.在这里,应用程序可能已运行多次,持续数月,之后我们突然需要再次请求权限.
在这些情况下,我们是否应该跟踪我们是否自己要求获得许可?或者Android M API中是否有我遗漏的东西告诉我们之前是否询问过?
@SuppressWarningsAndroid Studio中支持的所有值是什么?
我找不到任何关于它的文档,我知道它与Eclipse不同,因为"null"不起作用.您可以使用"all"捕获空警告,但您可以想象我宁愿不这样做.
我试图编写一个RemotePlaybackClient示例应用程序,部分原因是Google发布的aapt应用程序崩溃了.
我可以获得RemotePlaybackClient支持play(),并在Chromecast上播放视频.
但是,当我打电话时stop(),要停止播放视频,而Chromecast确实停止播放(显示一个黑色屏幕,其中有一个投射图标居中),SessionActionCallback我传入stop()调用的内容不会被调用onResult():
private void stop() {
logToTranscript(getActivity().getString(R.string.stop_requested));
SessionActionCallback stopCB=new SessionActionCallback() {
@Override
public void onResult(Bundle data, String sessionId,
MediaSessionStatus sessionStatus) {
logToTranscript(getActivity().getString(R.string.stopped));
isPlaying=false;
isPaused=false;
getActivity().supportInvalidateOptionsMenu();
endSession();
}
};
client.stop(null, stopCB);
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试也会发生同样的事情pause()- 未调用SessionActionCallback传递给pause().
Google发布的示例代码显示应该调用这些回调,但是,我再也无法成功编译.
有谁知道在什么情况下SessionActionCallback不会起作用,而ItemActionCallback使用它play() 会起作用?
UPDATE
我在5月份在[android-developers] Google Group上发布了这个帖子.我从来没有收到回复,直到上周我的一个学生做了之后才能重现这个问题.我想我会把它发布在这里,看看它是否为任何人敲响了任何铃声.
在我的一个代码示例中,我有以下方法:
static Cursor getAll(SQLiteDatabase db, String orderBy) {
return(db.rawQuery("SELECT * FROM restaurants "+orderBy, null));
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,偶尔会得到这个:
05-01 14:45:05.849: ERROR/AndroidRuntime(1145):
java.lang.IllegalStateException: attempt to acquire a reference on a
close SQLiteClosable
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:31)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:56)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1118)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1092)
05-01 14:45:05.849: ERROR/AndroidRuntime(1145): at
apt.tutorial.Restaurant.getAll(Restaurant.java:14)
Run Code Online (Sandbox Code Playgroud)
这对我来说毫无意义.数据库肯定是开放的.这
SQLiteClosable是由SQLiteQuery创建的SQLiteQueryDriver,我没有看到任何证据表明存在一个对象池或者在这里可以解释"新"如何SQLiteClosable已经关闭的事情.事实上它是零星的(意味着相同的UI操作有时会触发异常,但并非总是如此)表明某种池,竞争条件或某种东西......但我不知道在哪里.
思考?
谢谢! …
我正在开发一个库,允许应用程序自行更新,以便在Android Market之外分发.
我最初的计划是包含将APK文件下载到内部存储的代码,然后通过a ContentProvider和a 安装它content:// Uri.但是,当我尝试这样做时,安装程序系统向LogCat转储了一个"Skipping dir:"警告,但未能实际安装它.有一次,我切换到下载APK到外部存储和使用file:// Uri与ACTION_VIEW安装程序Intent,它的工作.
在"跳过目录"的消息似乎被记录parsePackage()在PackageParser,这似乎认为它正在与一个File.这表明我们不能使用content:// Uri价值观.
有没有人成功地使用ACTION_VIEW上application/vnd.android.package-archive Intent了content:// Uri?如果是这样,是否有一些特定的技巧来设置ContentProvider它使它工作?
谢谢!
Environment:
Mac OS 10.10.3
Android studio:1.2.11
grandle:2.2.1
Run Code Online (Sandbox Code Playgroud)
日志:
Information:Gradle tasks [:generateDebugSources, :generateDebugTestSources]
:preBuild
:preDebugBuild
:checkDebugManifest
:prepareDebugDependencies
:compileDebugAidl FAILED
Error:Execution failed for task ':compileDebugAidl'.
> aidl is missing
Run Code Online (Sandbox Code Playgroud)
// Top-level build file where you can add configuration options common to all sub-projects/modules.
import org.gradle.internal.os.OperatingSystem
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
}
}
allprojects {
repositories {
jcenter()
}
}
String SDK_DIR = System.getenv("ANDROID_HOME")
if(SDK_DIR == null) {
Properties props = new Properties()
props.load(new FileInputStream(project.rootProject.file("local.properties")))
SDK_DIR = …Run Code Online (Sandbox Code Playgroud) 我正在开发一个库,使Camera开发人员更容易使用API.
Droid Incredible 2在纵向模式下使用后置摄像头无法拍照.具体来说,我在LogCat中得到了这个序列:
08-18 09:25:52.094: E/QualcommCameraHardware(1368): native_get_picture: MSM_CAM_IOCTL_GET_PICTURE fd 25 error Connection timed out
08-18 09:25:52.094: E/QualcommCameraHardware(1368): getPicture failed!
08-18 09:25:52.094: E/QualcommCameraHardware(1368): get picture failed, giving jpeg callback with NULL data
Run Code Online (Sandbox Code Playgroud)
这些消息出现约5秒钟后,我打电话takePicture()的Camera,这与一些旧的源代码,我看到适合QualcommCameraHardware,设置了一个5000毫秒超时的ioctl()通话发言的摄像头硬件.
最终结果是onPictureTaken()传递了一个null byte[]JPEG数据,这意味着我们没有照片.
该设备可在所有其他测试配置中使用我的代码,包括使用前置摄像头以纵向模式工作.
有没有人知道可能导致这种特殊失败的特定事物?
UPDATE
我无法再重现错误.我会删除这个问题,但一旦有答案,这显然是不可能的.
是否可以使用带有DialogFragment的新导航架构组件?我是否必须创建自定义导航器?
我很乐意将它们与导航图中的新功能结合使用.
android android-architecture-components android-jetpack android-architecture-navigation
Android开发者文档,作为Project Svelte的一部分(座右铭:"你曾尝试将Bugdroid装入紧身牛仔裤吗?!?"),有一个关于管理你的应用程序内存的页面.它包含:
当用户导航到其他应用并且您的UI不再可见时,您应该释放仅由您的UI使用的所有资源.此时释放UI资源可以显着提高系统缓存进程的容量,这直接影响用户体验的质量.
和:
TRIM_MEMORY_RUNNING_LOW:您的应用程序正在运行且不被视为可用,但设备的内存运行速度要低得多,因此您应该释放未使用的资源以提高系统性能(这会直接影响应用程序的性能).
等等.
但是,如果"释放资源"实际上会以某种方式影响系统RAM,这些只会有意义.
我的印象是Dalvik VM表现得像Java VM一样(或者可能"做",如果他们在我不看的时候改变了它).AFAIK,Java VM分配系统RAM以增加堆大小但从不释放它 - 一旦分配,只要进程运行,它仍然是堆空间的一部分.
如果Dalvik VM的行为方式相同,那么我无法看到如何增加流程中未分配的堆空间量会对整体系统性能产生任何影响.现在,为我们的进程释放堆空间是一件好事,也许这样做会降低我们将来需要更多系统RAM的可能性......但这不是文档所暗示的.文档指出"此时释放UI资源可以显着提高系统缓存进程的容量"; 它没有说"此时释放UI资源没有立竿见影的效果,但将来有助于减少应用程序的系统RAM占用空间".
现在,如果指令告诉我们释放通过NDK分配的内存,那将是有意义的,因为它发生在Dalvik堆之外并且会影响系统RAM.但是文档没有得出这种区别.
除了终止进程之外,Dalvik VM是否实际将已分配的RAM释放回系统?如果是的话,何时?而且,在较小的程度上,考虑到垃圾收集器是非压缩和非复制的,它是如何完成的?
谢谢!
我们必须enterPictureInPictureMode()将活动从其当前形式转移到画中画表示.
除了破坏活动之外,我们还原的方法是什么,将活动恢复到正常状态?没有exitPictureInPictureMode(),leavePictureInPictureMode()或janeGetMeOffThisCrazyPictureInPictureModeThing()方法Activity,文档似乎没有涵盖替代方案.
我对Android O的解决方案感兴趣,对于移动设备上的画中画模式,虽然如果它也适用于Android TV,太棒了!
更新2017-04-08:如果您想要的是当用户单击X按钮退出画中画模式时返回正常模式,您可以执行以下操作:
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode);
if (!isInPictureInPictureMode) {
getApplication().startActivity(new Intent(this, getClass())
.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
}
}
Run Code Online (Sandbox Code Playgroud)
关键位是调用startActivity()再次启动当前活动FLAG_ACTIVITY_REORDER_TO_FRONT.对于singleTask活动,您需要在某些非Activity上下文中调用它,例如Application单例.这似乎没有触发onStop()或onStart(),但它确实触发onNewIntent()(无论Intent你传递给什么startActivity()).
android ×10
aidl ×1
android-architecture-components ×1
android-architecture-navigation ×1
chromecast ×1
compilation ×1
dalvik ×1
google-cast ×1
java ×1