有时(大约50%的时间),在调试Android应用程序时,为了进入一个功能,我使用F5(F6用于翻阅它)但它什么都不做
有时候,常规调试键都不起作用(F5,F6,F7,F8,也许是其他我不知道的).
目前,解决此问题的唯一方法是从"Debug"视图中选择当前线程(显示每个线程的当前堆栈),然后按F5键.当情况更糟(例如,无法使用内容辅助)时,我重启eclipse.
说到线程的,我发现,如果我有多个线程运行,有时当我尝试走得更远,它转到另一个线程,这是恼人的,因为我失去了我的当前线程的浓度.我知道它确实有道理,但它真的很烦人,特别是如果我考虑到有多个线程.
为什么会发生这些事情,我该如何解决它们?
注意:我有Eclipse,ADT和Android SDK的最新版本.在设备和模拟器上都会出现问题.
Android 应用程序可以使用管理策略获得一些特殊权限,例如打开锁定屏幕。
因此,在用户撤销其管理员权限之前,无法卸载这些应用程序。
我希望有一个功能来检查给定的应用程序(给定应用程序的包名称)是否具有管理员权限,如果是,我将打开此应用程序的管理员设置页面,以允许用户撤销其权限。
事实证明,已经有一个函数可以做到这一点。
首先你得到一个 DevicePolicyManager 的实例:
DevicePolicyManager dpm=(DevicePolicyManager)context.getSystemService(Context.DEVICE_POLICY_SERVICE);
Run Code Online (Sandbox Code Playgroud)
然后你应该调用isAdminActive,并得到真/假的结果。
但是,该函数的参数是 ComponentName,这意味着它不仅需要包名称,还需要应用程序特定类的路径。
另一种方法是使用getActiveAdmins查询所有活动的管理应用程序。
稍后,您可以使用以下命令进入管理页面:
final Intent intent=new Intent();
intent.setComponent(new ComponentName("com.android.settings","com.android.settings.DeviceAdminSettings"));
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
或者更具体地说,要启用/禁用应用程序管理员权限:
final Intent intent=new Intent();
intent.setComponent(new ComponentName("com.android.settings","com.android.settings.DeviceAdminAdd"));
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,componentName);
activity.startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
然而,这两种方式似乎有点hacky,因为它们不使用android的官方API,这可能会改变android版本和roms。
检查给定应用程序(包名称)是否具有管理员权限的最佳方法是什么?
进入管理页面的最佳方式是什么?有没有更安全的方法去那里?也许是我对安全屏幕意图所做的回退机制(由于某种原因,我在 API 中找不到)?
阅读这篇文章的答案后,我决定分享调查结果:
如果你想安全,你可以告诉用户自己去管理屏幕,只引导他到安全屏幕:
intent=new Intent(Settings.ACTION_SECURITY_SETTINGS);
context.startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
但是,我认为下一种方法应该适用于所有设备:
Intent intent=new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
final PackageManager packageManager=context.getPackageManager();
final List<ResolveInfo> resolveInfos=packageManager.queryIntentActivities(intent,0);
if(resolveInfos!=null&&!resolveInfos.isEmpty())
try
{
final ResolveInfo resolveInfo=resolveInfos.get(0);
intent=new Intent();
intent.setComponent(new ComponentName(resolveInfo.activityInfo.packageName,resolveInfo.activityInfo.name));
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,componentNameResult);
context.startActivity(intent);
return true;
}
catch(final Exception e)
{}
Run Code Online (Sandbox Code Playgroud)
如果失败,您可以随时使用我编写的任何方法,最后,调用安全的方法。
我在IOUtils上使用了一个很好的函数叫做"closeQuietly",它关闭了流,无论它在哪里.
例如:
InputStream input = null;
try
{
...
input = connection.getInputStream();
...
}
catch(Exception e)
{
}
finally
{
IOUtils.closeQuietly(input);
}
Run Code Online (Sandbox Code Playgroud)
不知何故,当我在finally块中调用它时,它还隐藏了Eclipse上的警告,"资源泄漏:'输入'未在此位置关闭".
这意味着在上面的代码中,没有这样的警告.
我不明白它是如何隐藏自身"外部世界"的警告.
我试图通过复制这个库的代码(例如这里)来检查它,但是当我在新类上使用它时会出现警告.它没有意义......
这是我创建的示例代码,用于显示警告将在您自己的类上发生:
public class MyIOUtils {
public static void closeQuietly(final InputStream input) {
if (input == null)
return;
try {
input.close();
} catch (final IOException ioe) {
}
}
public static void closeQuietly(final OutputStream output) {
if (output == null)
return;
try {
output.close();
} catch (final IOException …Run Code Online (Sandbox Code Playgroud) 我正在尝试调查办公室的应用程序需要更改其权限,以便很好地支持Android 6.
我发现哪个权限需要确认,哪个不是,除了一个:
<uses-permission android:name=".permission.C2D_MESSAGE"/>
Run Code Online (Sandbox Code Playgroud)
看来这个权限在我找不到的任何地方都没有提到,因为它没有被自动授予,但我无法找到用户可以将其作为确认启用的位置.
为了找到默认授予的权限,哪些不是,我只是调用了这段代码:
private void checkPermissionsOfApp(String packageName) {
PackageManager pm = getPackageManager();
try {
final ApplicationInfo applicationInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
Log.d("AppLog", "Listing all permissions of app with PackageName: " + applicationInfo.packageName);
PackageInfo packageInfo = pm.getPackageInfo(applicationInfo.packageName, PackageManager.GET_PERMISSIONS);
//Get Permissions
String[] requestedPermissions = packageInfo.requestedPermissions;
if (requestedPermissions != null) {
for (String permission : requestedPermissions) {
boolean permissionGranted = pm.checkPermission(permission, packageName) == PackageManager.PERMISSION_GRANTED;
Log.d("AppLog", "permission:" + permission + " permissionGranted:" + permissionGranted);
}
}
} catch …Run Code Online (Sandbox Code Playgroud) permissions android google-cloud-messaging android-6.0-marshmallow
我刚刚发现一个应用程序,允许禁用没有root的三星应用程序,并在后台:
https://play.google.com/store/apps/details?id=com.hecorat.packagedisabler
还有这个免费的:
https://play.google.com/store/apps/details?id=com.ospolice.packagedisabler
怎么会这样?它甚至没有显示系统类型的alertDialog来询问用户是否可以禁用该应用程序.他们找到了允许这样做的缺陷吗?
它仅适用于某些三星应用程序吗?其他应用程序和其他公司怎么样?那也有可能吗?
是否可以将相同的机制用于其他操作?像启用应用程序?
我目前没有三星设备,所以我甚至无法检查这个应用程序.
在大量寻找自动调整 TextView 大小的最佳解决方案(根据内容、大小、最小和最大行数和字体大小限制)之后,我为这一切做了一个合并的解决方案,这里。
注意:我不使用其他解决方案,因为它们不能很好地工作,每个都有自己的问题(不支持某些内容,文本超出 TextView,文本被截断,...)。
演示它的工作原理:
https://raw.githubusercontent.com/AndroidDeveloperLB/AutoFitTextView/master/animationPreview.gif
在某些情况下,一行的最后一个字符会换行到下一行,例如:
绿色是 TextView 的边界,红色在它之外。
基本上,给定 TextView 的大小、它的最小和最大字体大小和最小和最大行数,以及应该在其中的内容(文本),它会找到(使用二进制搜索)什么字体大小应该适合 TextView 的边界。
该代码已经在 Github 中可用,但这里是为了以防万一:
public class AutoResizeTextView extends AppCompatTextView {
private static final int NO_LINE_LIMIT = -1;
private final RectF _availableSpaceRect = new RectF();
private final SizeTester _sizeTester;
private float _maxTextSize, _spacingMult = 1.0f, _spacingAdd = 0.0f, _minTextSize;
private int _widthLimit, _maxLines;
private boolean _initialized = false;
private TextPaint _paint;
private interface SizeTester {
/**
* @param suggestedSize Size of …Run Code Online (Sandbox Code Playgroud) 几个月前,谷歌发布了一个新的 API 来检测位图上的人脸:
它应该比内置的 FaceDetector 类更快更好,并且与它相比没有限制/局限性(例如需要输入位图配置为 565 ,位图宽度均匀,并且最大面部数探测)。
代码也非常简单:
显现:
<meta-data
android:name="com.google.android.gms.vision.DEPENDENCIES"
android:value="face" />
Run Code Online (Sandbox Code Playgroud)
爪哇:
FaceDetector faceDetector = new
FaceDetector.Builder(getApplicationContext()).setTrackingEnabled(false)
.build();
if(!faceDetector.isOperational()){
//show error
return;
}
Frame frame = new Frame.Builder().setBitmap(myBitmap).build();
SparseArray<Face> faces = faceDetector.detect(frame);
Run Code Online (Sandbox Code Playgroud)
似乎该 API 在某些设备上不可用,在调用“isOperational()”时返回“false”。
我发现了一些线索:
在Github(此处)上,其他人也发现了这个问题。
该示例 …
Google已使用Firebase Analytics和Firebase远程配置为A/B测试发布了全新的API和服务.
虽然我尝试将该服务用于其他目的(此处和此处),但我还需要将其用于A/B测试.
事实是,我无法找到如何让它显示分析实验变体结果所需的信息.
它只是没有显示(在这个网站上),或者我没有看到正确的地方:
为了尝试一个实验,我按照教程说我应该做的,包括:
boolean isDebug = AppComponentsHelper.isInDebugFlavour(context);
mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder().setDeveloperModeEnabled(isDebug).build();
mFirebaseRemoteConfig.setConfigSettings(configSettings);
final HashMap<String, Object> defaults = new HashMap<>();
for (ExperimentType experimentType : ExperimentType.values())
defaults.put(experimentType.experimentId, experimentType.defaultValues);
mFirebaseRemoteConfig.setDefaults(defaults);
long cacheExpiration = isDebug ? 0 : TimeUnit.HOURS.toSeconds(1);
mFirebaseRemoteConfig.fetch(cacheExpiration)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
mFirebaseRemoteConfig.activateFetched();
final FirebaseAnalytics firebaseAnalytics = FirebaseAnalytics.getInstance(context); …Run Code Online (Sandbox Code Playgroud)Html.fromHtml几乎没有任何关于它支持哪些标签的文档。
据报道,它确实支持许多网站上的“font”标签(如此处),但我无法找出在此标签内设置“face”属性时可用的字体。
我可以假设哪些字体始终可用?其中哪些仅来自特定的 Android 版本?某处有他们的名单吗?
编辑:看来答案应该在“/system/etc/fonts.xml”文件中。以下是 Android 6.0.1 上的内容:
<familyset version="22">
<!-- first font is default -->
<family name="sans-serif">
<font weight="100" style="normal">Roboto-Thin.ttf</font>
<font weight="100" style="italic">Roboto-ThinItalic.ttf</font>
<font weight="300" style="normal">Roboto-Light.ttf</font>
<font weight="300" style="italic">Roboto-LightItalic.ttf</font>
<font weight="400" style="normal">Roboto-Regular.ttf</font>
<font weight="400" style="italic">Roboto-Italic.ttf</font>
<font weight="500" style="normal">Roboto-Medium.ttf</font>
<font weight="500" style="italic">Roboto-MediumItalic.ttf</font>
<font weight="900" style="normal">Roboto-Black.ttf</font>
<font weight="900" style="italic">Roboto-BlackItalic.ttf</font>
<font weight="700" style="normal">Roboto-Bold.ttf</font>
<font weight="700" style="italic">Roboto-BoldItalic.ttf</font>
</family>
<!-- Note that aliases must come after the fonts they reference. -->
<alias name="sans-serif-thin" to="sans-serif" weight="100" />
<alias name="sans-serif-light" to="sans-serif" weight="300" …Run Code Online (Sandbox Code Playgroud) 到目前为止,使用此意图有一种简单的方法来安装APK文件:
final Intent intent=new Intent(Intent.ACTION_VIEW)
.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
Run Code Online (Sandbox Code Playgroud)
但是,如果你的应用程序中的Android API 24以上(牛轧糖- 7.0),你就可以或更新运行这段代码,你会得到一个异常,如图所示这里,例如:
android.os.FileUriExposedException: file:///storage/emulated/0/sample.apk exposed beyond app through Intent.getData()
Run Code Online (Sandbox Code Playgroud)
所以我做了我被告知的事情:使用支持库的FileProvider类,如下:
final Intent intent = new Intent(Intent.ACTION_VIEW)//
.setDataAndType(android.support.v4.content.FileProvider.getUriForFile(context,
context.getPackageName() + ".provider", apkFile),
"application/vnd.android.package-archive").addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Run Code Online (Sandbox Code Playgroud)
清单:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
Run Code Online (Sandbox Code Playgroud)
res/xml/provider_paths.xml:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<!--<external-path name="external_files" path="."/>-->
<external-path
name="files_root"
path="Android/data/${applicationId}"/>
<external-path
name="external_storage_root"
path="."/>
</paths>
Run Code Online (Sandbox Code Playgroud)
但是,现在它仅适用于Android Nougat.在Android 5.0上,它抛出一个异常:ActivityNotFoundException.
我可以添加一个Android OS版本的检查,并使用任何一种方法,但正如我所读,应该使用一种方法:FileProvider.
所以,我尝试使用我自己的ContentProvider充当FileProvider,但我得到了与支持库的FileProvider相同的异常.
这是我的代码:
final Intent intent = new Intent(Intent.ACTION_VIEW)
.setDataAndType(OpenFileProvider.prepareSingleFileProviderFile(apkFilePath),
"application/vnd.android.package-archive")
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Run Code Online (Sandbox Code Playgroud)
OpenFileProvider.java …
android android-intent apk android-fileprovider android-7.0-nougat