小编Rob*_*ill的帖子

android locationManager在removeUpdates之后继续调用onLocationChanged

我有一个应用程序,可以获得位置修复.该应用程序将从Gingerbread推出到手机上.一旦应用程序获得位置修复,就会向用户显示Toast消息.问题是当用户移动到下一个活动时,吐司消息可能会再出现十次.

我想我已经正确地实现了生命周期,例如

1)在onCreate()中获取位置管理器2)在onResume()中创建并将位置监听器传递给管理器3)删除onStop()中的更新

我知道我可以通过调用在Android> 4.x中绕过这个问题

mlocManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, mlocListener, null);
Run Code Online (Sandbox Code Playgroud)

但是我必须容纳Gingerbread所以调用单个请求不在api 2.3.x. 它在Android 4上工作正常但在姜饼上onLocationChanged方法继续执行10次.

我如何强制onLocationChanged方法只在姜饼上运行一次?

谢谢.

[编辑]我注意到,当我移动到下一个活动时,onlocationchanged方法继续执行,但如果我移动到另一个活动,则成功删除位置请求

@Override
protected void onStop() {
    mlocManager.removeUpdates(mlocListener); 
    mlocListener = null;
    super.onStop();
}

@Override
protected void onResume() {
    mlocListener = new MyLocationListener();
    if(isCompOptionsReceived == true){
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) {
            mlocManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, mlocListener, null);
        }else{
            mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);   
        }
    }        
    super.onResume();
}

private class MyLocationListener implements LocationListener {

    @Override
    public void onLocationChanged(Location loc) {
        //toast message
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void …
Run Code Online (Sandbox Code Playgroud)

gps android location

8
推荐指数
1
解决办法
6559
查看次数

Genymotion没有启动虚拟设备

我在Genymotion上创建了一个新的虚拟设备但我无法运行它.当我点击Genymotion GUI上的"开始"按钮时,没有任何反应.

在此输入图像描述

我能够从Virtual Box运行虚拟设备.虚拟设备显然配置良好,互联网正常运行.

在此输入图像描述

我目前的环境:

  • OS X 10.10.1
  • Genymotion 2.3.1
  • Virtual Box 4.3.20 r96996

值得一提的是,我最近格式化了计算机并从头开始安装了所有东西(甚至Yosemite),所以我可以错过依赖或其他东西.

任何有关如何修复它或获取日志以了解真正问题的帮助或提示将不胜感激.

谢谢

android virtualbox genymotion

8
推荐指数
1
解决办法
2258
查看次数

Gradle api与多模块项目实施的最佳实践

这是不是之间的区别的常见问题apiimplementation,并希望将但从构建一个多模块项目的点更先进的和有趣的.

假设我在应用程序中有以下模块

  • library
  • base
  • feature1
  • feature2
  • app

现在模块之间的关系是:

base 包装 library

feature1feature2使用(取决于)base

appfeature1feature2

这个多模块结构中的所有内容都应该能够使用Gradle的implementation依赖项工作,并且不需要在api任何地方使用该子句.

现在,让我们说feature1需要访问base包含在其中的实现细节library.

为了使library提供给feature1我们有两个选择,据我可以告诉:

  1. 更改implementationapibase泄漏依赖于依赖模块base

  2. library作为implementation依赖项添加,feature1而不会base泄漏依赖性library

当然,为了解决这个问题,这个例子已经被简化了,但是你明白了这可能会成为一个具有4或5级依赖关系的大量模块的配置地狱.

我们可以创建一个base-feature中间模块,它可以包装base并提供另一级抽象,以便feature1在不泄漏的情况下使用library,但让我们将该解决方案置于此问题的范围之外,以专注于依赖项的设置.


我在上述选项中检测到的一些权衡:

选项1)专业人士

  • 较小build.gradle的文件,因为不需要重复implementation条款
  • 更快的构建编程编辑.只需对api …

android gradle multi-module android-gradle-plugin

7
推荐指数
1
解决办法
844
查看次数

Android 2.3 Google Maps缺少资源maps_watermark_dark.png

我有一个将minSdkVersion设置为9 的Android应用程序.应用程序编译并运行,但是当它显示谷歌地图时,它崩溃了

android.content.res.Resources$NotFoundException: File res/drawable-mdpi-v4/maps_watermark_dark.png from drawable resource ID #0x7f02027c
Run Code Online (Sandbox Code Playgroud)

一切都指向播放服务库中缺少的资源.

我没有使用proguard,shrinkResources或resConfigs.

该设备是三星/ GT-S5360L/GT-S5360L:2.3.6/GINGERBREAD

这是相关部分 build.gradle

apply plugin: 'com.android.application'    

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        targetSdkVersion 21
        minSdkVersion 9
        versionCode 476
        versionName "4.7.6"
    }
}    
dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')

    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'com.google.android.gms:play-services:6.1.71'
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的堆栈跟踪:

D/AndroidRuntime(10297): Shutting down VM
W/dalvikvm(10297): threadid=1: thread exiting with uncaught exception (group=0x40020578)
E/AndroidRuntime(10297): FATAL EXCEPTION: main
E/AndroidRuntime(10297): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.safertaxi.driver/driver.activities.driving.ActivityDriving}: android.view.InflateException: Binary XML file line …
Run Code Online (Sandbox Code Playgroud)

android google-maps

6
推荐指数
1
解决办法
375
查看次数

在onPause之后触发OnClickListener?

我正在使用的项目使用视图展示器抽象.这是所有主要类的简化版本.

抽象活动(Wire Presenter实例,带View)

public abstract class MvpActivity<Presenter extends MvpPresenter>
        extends ActionBarActivity {

  protected Presenter mPresenter;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mPresenter = getPresenterInstance();
  }

  @Override protected void onResume() {
    super.onResume();
    mPresenter.onResume(this);
  }

  @Override protected void onPause() {
    mPresenter.onPause();
    super.onPause();
  }
}
Run Code Online (Sandbox Code Playgroud)

视图界面

public interface MyView {
  void redirect();
}
Run Code Online (Sandbox Code Playgroud)

视图实现

public class MyActivity
        extends MvpActivity<MyPresenter>
        implements MyView {

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_view);

    Button myButton = (Button)findViewById(R.id.my_button);

    myButton.setOnClickListener(v -> mPresenter.onButtonPressed());
  }

  @Override protected MyPresenter getPresenterInstance() …
Run Code Online (Sandbox Code Playgroud)

android android-activity android-actionbaractivity

6
推荐指数
1
解决办法
1395
查看次数

使用 Kotlin DSL 的 Android 子项目

我正在通过 Gradle 构建文件迁移到 Kotlin DSL,但遇到了一个问题。

在我的父母身上build.gradle,我有以下一段代码



buildscript {
  repositories {
    google()
    mavenCentral()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:3.4.2'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${Version.kotlin}"
  }
}

allprojects {
  repositories {
    google()
    mavenCentral()
  }
}

subprojects {
  afterEvaluate { project ->

    if (project.plugins.findPlugin('com.android.application') ?:
      project.plugins.findPlugin('com.android.library')) {

      android {
        compileSdkVersion = Android.SDK_COMPILE
        defaultConfig {
          minSdkVersion Android.SDK_MIN
          targetSdkVersion Android.SDK_TARGET
          versionCode = Android.VERSION_CODE
          versionName = Android.VERSION_NAME
        }
        ...
      } 
    }
  }
}

Run Code Online (Sandbox Code Playgroud)

这允许我只在一个地方配置所有作为 android 应用程序或库的模块。

但是,当我迁移到 kotlin 时,这似乎不起作用:


buildscript {
  repositories {
    google()
    mavenCentral()
  }
  dependencies { …
Run Code Online (Sandbox Code Playgroud)

gradle android-gradle-plugin gradle-kotlin-dsl

6
推荐指数
1
解决办法
2065
查看次数

当 targetSdkVersion 为 29 时,Android Lint 报告 OldTargetApi

我在 Github Actions 上收到以下 Lint 错误(该项目的当前 CI 解决方案)

 > Task :application:lint FAILED
Ran lint on variant debug: 1 issues found
Ran lint on variant release: 1 issues found
Wrote HTML report to file:///~/application/build/reports/lint/lint-results.html

64 actionable tasks: 55 executed, 9 from cache
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':application:lint'.
> Lint found errors in the project; aborting build.

android {
    lintOptions {
        abortOnError false
    }
}
...
Errors found:
  
~/application/build.gradle.kts:17: Error: Not targeting …
Run Code Online (Sandbox Code Playgroud)

android android-lint android-gradle-plugin

6
推荐指数
1
解决办法
1276
查看次数

Json到Android中的POJO映射

在Android中使用Rest Framework处理json有什么好的做法.例如,如果我得到一个特定的json结果如下(或任何其他,我只是给一些更复杂的东西):

{"lifts": 
[{
   "id":26,
   "time":"2012-11-21T12:00:00Z",
   "capacity":4,
   "price":10,
   "from": { 
            "description":null,
            "city": {
                      "name":"Montreal"
                    }
           },
    "to":{
           "description":"24 rue de la ville",
           "city":{
                   "name":"Sherbrooke"
                  }
          },
    "driver":{
              "first_name": "Benjamin",  
              "image":"https://graph.facebook.com/693607843/picture?type=large"
             }
    }
]}
Run Code Online (Sandbox Code Playgroud)

1)我应该手动处理结果并获取每个值来填充我的ui ...(不是真的)

2)我应该为每个对象创建一个POJO(使用JSONObject处理映射).在我的例子中,我将不得不创建一个处理所有参数的提升对象,甚至创建更多的POJO,以用于例如图像和可能的位置.(所以基本上,我经常需要检查我的api休息框架,看看我的对象是如何在服务器端完成的,我正在将我的模型从服务器复制到android客户端).

3)是否有任何框架来处理映射(序列化和反序列化).

我目前正在使用2号选项,但想知道那里是否有更好的东西.到目前为止,它对我有用,用于接收和发送.

android json pojo

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

配置Netty SSL客户端套接字以在Android中发送SNI标头

我想使用Netty框架创建SSL / TLS连接,该框架将在握手期间一起发送SNI标头。我当前的代码如下所示:

SslContext创建:

    TrustManagerFactory trustManagerFactory = SimpleTrustManagerFactory.getInstance(
            SimpleTrustManagerFactory.getDefaultAlgorithm());
    trustManagerFactory.init((KeyStore)null);

    sslContext = SslContextBuilder
            .forClient()
            .sslProvider(SslProvider.JDK)
            // TODO p0: Ensure all the versions we support have this algorithm installed
            .trustManager(trustManagerFactory)
            .build();
Run Code Online (Sandbox Code Playgroud)

然后在管道创建期间:

    pipeline.addLast(sslContext.newHandler(ch.alloc(), cloud.getHostName(), cloud.getPort()));
Run Code Online (Sandbox Code Playgroud)

但是,不会发送SNI标头。强制Netty在SSL客户端握手中提供SNI缺少什么?

sockets ssl netty sni

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

BOOT_COMPLETED从未收到过

每个设备都发送BOOT_COMPLETED吗?我想在Boot Completed上启动一个Activity.

我在Manifest中添加了以下内容:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".BootFinished">            
    <intent-filter>                
         <action android:name="android.intent.action.BOOT_COMPLETED" />           
    </intent-filter>        
</receiver>
Run Code Online (Sandbox Code Playgroud)

创建了以下类(接收者):

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.widget.Toast;

public class BootFinished extends BroadcastReceiver {

    @Override        
    public void onReceive(Context mContext, Intent intent) {
        if(intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {               
          //do something like start an activity or service
        }

        try {
            PackageManager pm = mContext.getPackageManager();
            Intent launch = pm.getLaunchIntentForPackage("com.example.afterboot");
            mContext.startActivity(launch);
        } catch (Exception e) {
            Toast.makeText(mContext, e.getMessage(), Toast.LENGTH_SHORT);
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?谢谢!

boot android broadcastreceiver android-intent

2
推荐指数
1
解决办法
4653
查看次数