谷歌似乎最终关闭了获取当前前台应用程序包的所有大门.
在Lollipop更新之后,getRunningTasks(int maxNum)
由于这个答案,我使用此代码从Lollipop获取前台应用程序包:
final int PROCESS_STATE_TOP = 2;
RunningAppProcessInfo currentInfo = null;
Field field = null;
try {
field = RunningAppProcessInfo.class.getDeclaredField("processState");
} catch (Exception ignored) {
}
ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appList = am.getRunningAppProcesses();
for (RunningAppProcessInfo app : appList) {
if (app.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
app.importanceReasonCode == 0 ) {
Integer state = null;
try {
state = field.getInt( app );
} catch (Exception ignored) {
}
if (state != null && state == …
Run Code Online (Sandbox Code Playgroud) 我想使用相同的按钮来执行2种不同的方法.用户单击它时的一种方法和用户LONG单击它时的第二种方法(不同).
我用它来进行单击(这非常有效):
Button downSelected = (Button) findViewById(R.id.downSelected);
downSelected.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
method();
}
}
});
Run Code Online (Sandbox Code Playgroud)
我试图添加一个longClickListener但它没有用.
欣赏有关如何解决这个问题的任何想法.
谢谢!
我实现了新的SwipeRefreshLayout
成分在我的应用程序,它与任何垂直意见工作得很好,比如ListView
,GridView
和ScrollView
.
它在水平视图中表现得很糟糕,比如HorizontalScrollView
.向右或向左滚动时,SwipeRefreshLayout
视图会缓存触摸,阻止HorizontalScrollView
接收并开始垂直滚动以执行刷新.
我尝试解决这个问题,因为我之前解决了ScrollView
与ViewPager
内部垂直问题,使用requestDisallowInterceptTouchEvent
但它没有用.我还注意到,在原始SwipeRefreshLayout
类中重写此方法而不返回super.谷歌的开发者留下了评论" //Nope.
":)
因为SwipeRefreshLayout
组件相对较新,我找不到修复水平滚动问题的解决方案,同时仍然允许滑动刷新视图以跟踪和处理垂直滚动,所以我想我会分享我的解决方案,希望它会让人节省一个小时或两个.
我正在使用新的UsageStatsManager
API来获取 Android 5.0 Lollipop中的当前前台应用程序.要使用此API,用户必须在Settings->Security->Apps with usage access
屏幕中启用该应用程序.
我使用此Intent将用户直接发送到此屏幕:
startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));
Run Code Online (Sandbox Code Playgroud)
现在,我想验证用户启用我的应用程序.我想这样做,就像我验证用户启用我的应用程序使用NotificationListenerService
但我不知道什么是String键,如果它甚至存在.
Settings.Secure.getString(contentResolver, "enabled_notification_listeners");
// Tried Settings.ACTION_USAGE_ACCESS_SETTINGS as key but it returns null
第二种方法是查询使用情况统计信息并检查它是否返回结果(当应用程序未启用时返回一个空数组)并且它大部分时间都有效,但有时即使我的应用程序启用也会返回0结果.
UsageStatsManager mUsageStatsManager = (UsageStatsManager) context.getSystemService("usagestats");
long time = System.currentTimeMillis();
List stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 10, time);
if (stats == null || stats.isEmpty()) {
// Usage access is not enabled
}
Run Code Online (Sandbox Code Playgroud)
有没有办法检查我的应用程序是否启用了使用权限?
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView text = (TextView) view.findViewById(R.id.btitle);
registerForContextMenu(text);
view.showContextMenu();
}
});
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
TextView text = (TextView) v.findViewById(R.id.btitle);
CharSequence itemTitle = text.getText();
menu.setHeaderTitle(itemTitle);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
Run Code Online (Sandbox Code Playgroud)
你好,
我正在尝试在短项目点击上打开contextMenu.我只是在添加registerForContextMenu(getListView());
某个地方时才设法这样做 但是这也会在长按(即我不希望发生)时触发contextMenu.
view.showContextMenu()
但除非我添加,否则它什么都不做registerForContextMenu(getListView());
.showContextMenu()
但没有做任何事情......此外,我想获得点击的项目图像+文本,以便我可以在contextMenu中使用它们.
感谢帮助!
我熟悉我可以在数组中获取元素位置的方法,尤其是这里显示的元素位置:数组中的元素位置
但我的问题是我无法弄清楚如何转换此代码以满足我的需求.
我想检查的是String中是否有一个匹配的ArrayList,如果是,那么ArrayList中String的索引是什么.
烦人的部分是我设法验证String在ArrayList中(参见我的代码的第一行)
listPackages是ArrayList
current_package是我想在listPackages中找到它的位置的String.
这是我的代码:
if (listPackages.contains(current_package)) {
int position = -1;
for(int j = 0; j < listPackages.size(); j++) {
if(listPackages[j] == current_package) {
position = j;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助!
谢谢!
我试图让用户使用以下代码选择一个电子邮件帐户:
Intent intent = AccountPicker.newChooseAccountIntent(null, null, new String[]{"com.google"},
false, null, null, null, null);
startActivityForResult(intent, 23);
Run Code Online (Sandbox Code Playgroud)
此代码效果很好,但如果用户没有Gmail帐户,但雅虎,Hotmail等.如何通过更改第三个参数显示所有电子邮件帐户:
new String[]{"com.google"}
Run Code Online (Sandbox Code Playgroud)
非常感谢你
和其他人一样,我搬到了Android Studio并遇到了问题.
我目前的问题 - Android Studio不会让我在没有Manifest中的可启动活动的情况下运行应用程序,例如,我的应用程序Pro键,它不是可启动的并且可以在Eclipse中运行.
显然它不是想运行但有没有办法直接从Studio安装它?
从Android Pie(API 28)开始,Google不允许在2个不同的进程中使用单个WebView实例。
根据要求,我打电话给我,WebView.setDataDirectorySuffix("dir_name_no_separator")
但不幸的是,我得到了一个例外。我试图在第二个进程Service onCreate()中调用此方法。
java.lang.RuntimeException: Unable to create service com.myapp.service.MyService: java.lang.IllegalStateException: Can't set data directory suffix: WebView already initialized
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3544)
at android.app.ActivityThread.access$1300(ActivityThread.java:199)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1666)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.IllegalStateException: Can't set data directory suffix: WebView already initialized
at android.webkit.WebViewFactory.setDataDirectorySuffix(WebViewFactory.java:136)
at android.webkit.WebView.setDataDirectorySuffix(WebView.java:2165)
at com.myapp.service.MyService.onCreate(MyService.java:134)
Run Code Online (Sandbox Code Playgroud)
我找不到该异常的任何原因。我没有两次调用此方法,也没有在主过程中调用它。有任何想法吗?
我一直在尝试编译FFMPEG,所以我可以在我的Android应用程序中使用命令.结果应该是1个静态文件"ffmpeg",它不依赖于包.没有.so文件.
我设法用guardianProject编译它,一切正常,但源太旧了,缺乏我需要的选项.我在VirtualBox上使用最新的Ubuntu,所有必需品都已安装和更新(gawk,yasm,aptitude等...).
网络上有很多例子.以下是我尝试过的每个选项遇到的问题.我很感激以下任何一个错误的帮助:
Guardian项目 - 我设法编译它并获取ffmpeg文件,但它使用的旧版本的ffmpeg不包含该"-movFlags faststart"
选项.我尝试在那里抛出新的ffmpeg(2.3.3),但它只是抛出错误.(我运行了git submodule init并更新)
JayH5 - 一个更通用的构建文件,基本上应该适用于每个ffmpeg.我更新了构建脚本以使用最新的NDK,它似乎正在工作但是它失败了/home/dor/Desktop/ndk/android-ndk-r10/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-pkg-config not found, library detection may fail.
我读到这个并且它似乎需要一个hack,我不明白如何实现.
Trovao - 这是一个非常好的项目,构建脚本甚至可以下载最新的ffmpeg和x264源代码,我甚至成功将其编译为FFMPEG和X264文件,但是当我使用它时,我收到此错误:could not load library "libx264.so.142
这很奇怪,因为x264在那里,这个项目的整个想法是取消.so文件的需要.
我很感激帮助找出如何解决任何问题.我更喜欢使用JayH5构建脚本,因为它似乎是最直接的...
JayH5构建文件:
#!/bin/bash
# set the base path to your Android NDK (or export NDK to environment)
if [[ "x$NDK_BASE" == "x" ]]; then
NDK_BASE=/opt/android-ndk
echo "No NDK_BASE set, using $NDK_BASE"
fi
NDK_PLATFORM_VERSION=14
NDK_ABI=arm
NDK_COMPILER_VERSION=4.8
NDK_SYSROOT=$NDK_BASE/platforms/android-$NDK_PLATFORM_VERSION/arch-$NDK_ABI
NDK_UNAME=`uname -s | tr '[A-Z]' '[a-z]'` # Convert Linux -> linux
HOST=$NDK_ABI-linux-androideabi
NDK_TOOLCHAIN_BASE=$NDK_BASE/toolchains/$HOST-$NDK_COMPILER_VERSION/prebuilt/$NDK_UNAME-x86 …
Run Code Online (Sandbox Code Playgroud)