小编and*_*per的帖子

在Eclipse上调试时无法使用F5进入功能

有时(大约50%的时间),在调试Android应用程序时,为了进入一个功能,我使用F5(F6用于翻阅它)但它什么都不做

有时候,常规调试键都不起作用(F5,F6,F7,F8,也许是其他我不知道的).

目前,解决此问题的唯一方法是从"Debug"视图中选择当前线程(显示每个线程的当前堆栈),然后按F5键.当情况更糟(例如,无法使用内容辅助)时,我重启eclipse.

说到线程的,我发现,如果我有多个线程运行,有时当我尝试走得更远,它转到另一个线程,这是恼人的,因为我失去了我的当前线程的浓度.我知道它确实有道理,但它真的很烦人,特别是如果我考虑到有多个线程.

为什么会发生这些事情,我该如何解决它们?

注意:我有Eclipse,ADT和Android SDK的最新版本.在设备和模拟器上都会出现问题.

eclipse debugging multithreading android step-into

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

如何检查特定应用程序是否具有管理员权限,并转到其管理员屏幕?

背景

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)

如果失败,您可以随时使用我编写的任何方法,最后,调用安全的方法。

settings android admin android-intent

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

IOUtils.close如何隐藏"资源泄漏"警告?

背景

我在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)

java eclipse stream compiler-warnings resource-leak

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

为什么Android 6上没有授予GCM权限?

背景

我正在尝试调查办公室的应用程序需要更改其权限,以便很好地支持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

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

如何以编程方式禁用没有root的应用程序?

我刚刚发现一个应用程序,允许禁用没有root的三星应用程序,并在后台:

https://play.google.com/store/apps/details?id=com.hecorat.packagedisabler

还有这个免费的:

https://play.google.com/store/apps/details?id=com.ospolice.packagedisabler

  1. 怎么会这样?它甚至没有显示系统类型的alertDialog来询问用户是否可以禁用该应用程序.他们找到了允许这样做的缺陷吗?

  2. 它仅适用于某些三星应用程序吗?其他应用程序和其他公司怎么样?那也有可能吗?

  3. 是否可以将相同的机制用于其他操作?像启用应用程序?

我目前没有三星设备,所以我甚至无法检查这个应用程序.

android android-package-managers samsung-mobile

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

如何避免 TextView 中的文本换行,以自动调整文本大小?

背景

在大量寻找自动调整 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)

android textview autoresize

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

为什么新的 Play-Services FaceDetector 在某些设备上不可用?

背景

几个月前,谷歌发布了一个新的 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”。

  • 在 Nexus 4 (Android 4.4.4) 和 Nexus 5 (Android 6.0.1) 上它根本不起作用
  • 在 Nexus 5x (Android 6.0.1) 和 Galaxy S4 (Android 5.0) 上运行良好
  • 在 LG G2 (Android 4.2.2) 上,它仅在第二次运行示例时有效。

我发现了什么

我发现了一些线索:

  1. 在Github(此处)上,其他人也发现了这个问题。

  2. 该示例 …

android face-detection google-play-services

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

如何正确使用Firebase-Analytcs进行A/B测试?

背景

Google已使用Firebase AnalyticsFirebase远程配置为A/B测试发布了全新的API和服务.

问题

虽然我尝试将该服务用于其他目的(此处此处),但我还需要将其用于A/B测试.

事实是,我无法找到如何让它显示分析实验变体结果所需的信息.

它只是没有显示(在这个网站上),或者我没有看到正确的地方:

在此输入图像描述

我试过的

为了尝试一个实验,我按照教程说我应该做的,包括:

  1. 代码中的初始化与示例初始化大致相同:

    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)

android ab-testing firebase firebase-analytics

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

Html.fromHtml 函数的“font”标签中可以使用哪些字体?

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)

fonts android font-face

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

如何为所有Android版本打开APK文件

背景

到目前为止,使用此意图有一种简单的方法来安装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

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