MDA/MDD/TDD/DDD/DDDDDDD
posts - 535, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2016年12月21日


repositories{
mavenCentral()
}
dependencies {
compile ('com.google.android.gms:play-services-maps:10.0.1')
}
按以上配置,运行clean时报错,无法加载play-services-maps 10.0.1包。
Error:(69, 14) Failed to resolve: com.google.android.gms:play-services-maps:10.0.1
<a href="install.m2.repo">Install Repository and sync project</a><br><a href="openFile:/Users/you/AndroidProjects/yourapp/app/build.gradle">Show in File</a><br><a href="open.dependency.in.project.structure">Show in Project Structure dialog</a>
点击Android Studio的提示如何修复的链接,就会自动下载Google的相关依赖包到本地。下载时弹出窗口中显示的一些信息如下。

Install Missing Componets
SDK Path:/User/you/Library/Android/sdk

To install:
- SDK Patch Applier v4 (patcher;v4)
- Google Repository (extras;google;m2repository)

Installing SDK Patch Applier v4
Downloading https://dl.google.com/android/repository/3534162-studio.sdk-patcher.zip
Installing SDK Patch Applier v4 in /Users/you/Library/Android/sdk/patcher/v4
Installation of SDK Patch Applier v4 complete.

Installing Google Repository
Downloading https://dl.google.com/android/repository/google_m2repository_gms_v8_rc42_wear_2b1_rc4.zip
Installing Google Repository in /Users/you/Library/Android/sdk/extras/google/m2repository
Installation of Google Repository complete.


http://stackoverflow.com/questions/16978190/add-google-maps-api-v2-in-a-fragment
http://www.joellipman.com/articles/google/android/application-development/android-os-add-googlemap-as-fragment.html
https://www.zhihu.com/question/20892245
http://blog.csdn.net/woshilisao/article/details/8647649 android fragment(android.support.v4.app.Fragment和android.app.Fragment区别)
http://www.tuicool.com/articles/YFBv6nJ Introduction to Google Maps API for Android

posted @ 2016-12-21 00:24 leekiang 阅读(54) | 评论 (0)编辑 收藏

2016年11月24日


https://github.com/lzyzsd/JsBridge  
注意:使用lzyzsd/JsBridge  ,覆盖WebViewClient时一定要继承BridgeWebViewClient,否则js和java互相调用不管用
webview.setWebViewClient(new BridgeWebViewClient(webview) 

另外还有一个WebViewJavascriptBridge:https://github.com/gzsll/WebViewJavascriptBridge

http://www.cnblogs.com/wingyip/p/5426477.html JsBridge实现Javascript和Java的互相调用
http://blog.csdn.net/sk719887916/article/details/47189607 
 Android 利用WebViewJavascriptBridge 实现js和java的交互
http://www.jb51.net/article/37208.htm Android在其他线程中更新UI线程的解决方法

posted @ 2016-11-24 16:19 leekiang 阅读(43) | 评论 (0)编辑 收藏

2016年10月26日

向下一个Activity传递数据(使用Bundle和Intent.putExtras)
Intent it = new Intent(Activity.Main.this, Activity2.class);
Bundle bundle=new Bundle();
bundle.putString("name", "This is from MainActivity!");
it.putExtras(bundle);       // it.putExtra("name","abc");
startActivity(it);            // startActivityForResult(it,REQUEST_CODE);
 
对于数据的获取可以采用:
Bundle bundle=getIntent().getExtras();
String name=bundle.getString("name");

参考:
http://www.cnblogs.com/feisky/archive/2010/01/16/1649081.html
http://www.cnblogs.com/tornadomeet/archive/2012/07/28/2613617.html 从一个activity跳转到另外一个activity

posted @ 2016-10-26 00:54 leekiang 阅读(54) | 评论 (0)编辑 收藏

2016年10月25日

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
minifyEnabled改为true。
ProGuard是Android SDK附带的。如果需要顶尖的安全性,ProGuard就力不从心了,可以使用DexGuard。

参考:
读懂 Android 中的代码混淆 http://droidyue.com/blog/2016/07/10/understanding-android-obfuscated-code-by-proguard/

posted @ 2016-10-25 23:41 leekiang 阅读(73) | 评论 (0)编辑 收藏

requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
增加代码requestWindowFeature(Window.FEATURE_NO_TITLE)以去掉标题栏,并且代码放在setContentView之前,但还是报异常
android.util.AndroidRuntimeException: requestFeature() must be called before adding content
AppCompatActivity改为Activity才得以解决。不知道AppCompatActivity和Activity有何区别。

参考:http://www.cnblogs.com/and_he/archive/2011/06/01/2067106.html Android中全屏或者取消标题栏

posted @ 2016-10-25 22:38 leekiang 阅读(52) | 评论 (0)编辑 收藏

2016年10月24日

 首先在“设置”-“关于手机”里多次点击【MIUI版本】进入开发者模式,但在Android Studio里运行时找不到设备,执行adb devices也看不到设备。
在拨号界面按  *#*#717717#*#*  , 出现 Diag USB port enable。 再次执行adb devices,看到设备了,但显示为unauthorized。
最后发现,设置-其他高级设置-开发者选项,开启“开发者选项”,同时开启“USB调试”,再次执行adb devices,终于成功的显示设备了。
 

posted @ 2016-10-24 11:45 leekiang 阅读(70) | 评论 (0)编辑 收藏

2016年10月21日

1.public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       view.loadUrl(url);
       return true;
  }
重写shouldOverrideUrlLoading方法,返回true表示点击链接是在当前webview里打开,而不是调用浏览器打开


WebViewClient与WebChromeClient的区别 http://blog.csdn.net/jackyhuangch/article/details/8310033
Android中WebView拦截替换网络请求数据http://droidyue.com/blog/2014/11/23/block-web-resource-in-webview/
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/1010/1569.html android WebView全面总结
自定义可下拉刷新的WebView http://www.voidcn.com/blog/Moy01/article/p-4587219.html
android webview远程调试http://www.cnblogs.com/carlos-guo/p/3920915.html
http://www.udpwork.com/item/13349.html  WebView处理网页位置请求
http://www.cnblogs.com/over140/archive/2013/03/07/2947721.html 带进度条的webview
http://blog.csdn.net/u014400200/article/details/38511419 webview处理视频
http://blog.csdn.net/jackyhuangch/article/details/8310033 关于android WebViewClient和WebChromeClient
http://www.weblog-life.net/entry/2016/03/12/080300 webview如何使用google地图,日本人写的
http://stackoverflow.com/questions/5329662/android-webview-geolocation  
https://github.com/delight-im/Android-AdvancedWebView 这个支持地理定位

posted @ 2016-10-21 21:43 leekiang 阅读(54) | 评论 (0)编辑 收藏

2016年10月13日

1. Android Studio2.2在mac下启动报错
找不到原因,改为使用Android Studio 2.1.3
下载地址:http://tools.android.com/download/studio/builds/2-1-3

2. 编译某项目报错Could not find property 'config' on SigningConfig container
在build.grade文件的android->signingConfigs节点下增加config配置
android {
    signingConfigs {
        config {
            keyAlias '你的key别名'
            keyPassword '你的key密码'
            storeFile file('你的密钥存储路径')
            storePassword '你的存储密码'
        }
    }
...

3. 编译报错failed to find target android-22
/Users/username/Library/Android/sdk/platforms下发现有android-24目录,故将编译级别都设为24。
修改build.grade文件的相关属性:
compileSdkVersion 24
buildToolsVersion "24.0.0"
targetSdkVersion 24
compile 'com.android.support:appcompat-v7:24.0.0'

4. 编译报错Gradle sync failed: Gradle DSL method not found: 'android()'
删除项目根目录下的build.gradle文件,因为app目录下已经有build.gradle了。
备份下根目录下build.gradle文件的内容:
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
allprojects {
    repositories {
        jcenter()
    }
}
android {
    compileSdkVersion 24
}
dependencies {
}

5. 编译报错Plugin with id 'com.android.application' not found
恢复项目根目录下的build.gradle文件,将内容修改为如下:
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
    }
}

6. 编译报错:failed to find Build Tools revision 24.0.0
/Users/username/Library/Android/sdk/build-tools下查看自己的BuildTools版本,发现是24.0.3,然后将buildToolsVersion修改为该版本:
buildToolsVersion "24.0.3"

7. Android Studio编译执行以下任务时一直等待,执行了一个小时也没动静。
Executing tasks: [:app:generateDebugSources, :app:generateDebugAndroidTestSources, :app:prepareDebugUnitTestDependencies, :app:mockableAndroidJar]
打开Preferences->Build-Excecution-Deployment->BuildTools->Gra‌​dle,勾选Offline work
参见http://stackoverflow.com/questions/25629368/how-to-fix-android-studio-getting-stuck-executing-gradle-tasks

8. Exception in thread "png-cruncher_5" java.lang.RuntimeException: Timed out while waiting for slave aapt process
不知道原因,最终是通过修改SDK Build Tools为19.1.0、升级JDK由JDK7升至JDK8、增加环境变量SLAVE_AAPT_TIMEOUT=30等搞定的

9. 如何修改SDK和JDK的路径
在File->Project Structure里修改

10. 修改Android Studio中java代码的编译级别
打开File --> Project Structure-->app,修改Source Compatibility和Target Compatibility

11.如何在使用gradle时增加--stacktrace参数
Preferences->Build-Excecution-Deployment->Compiler
增加--info或--debug,在解决报错时能看到更多的信息

12. 报错aapt ..finished with non- zero exit value 1
找不到原因,增加编译参数--info后发现有用的信息:invalid resource directory name: ..app\build\intermediates\res\merged\debug/values-b+sr+Latn

13.invalid resource directory name: ..app\build\intermediates\res\merged\debug/values-b+sr+Latn
不知道原因,将版本升级到21解决了。

14. 编译时报找不到AppCompatActivity类的错误
改为使用:compile 'com.android.support:appcompat-v7:22.2.1'
同时将版本由21升级到22

15. 生成apk时报错:Missing Gradle Project Information. Please check if the IDE successfully synchronized its state with the Gradle Project Model
在工具栏里点击“Sync Project with Gradle Files”按钮

16.导入某项目时报错Error:Gradle version 2.14.1 is required. Current version is 2.4. If using the gradle wrapper, try editing the distributionUrl in...
打开Android Studio的File->Project Structure,点击Project,将Gradle version修改为2.14.1
在/Applications/Android Studio.app/Contents/gradle下的确只有gradle-2.14.1

25.如何修改生成的apk的名字
http://www.jianshu.com/p/93051c9e97fb
Android Studio如何发布APK:http://chenfeicqq.iteye.com/blog/1889160

26. 在gradle.properties中增加android.enableBuildCache=true,貌似能加快编译速度。

posted @ 2016-10-13 21:25 leekiang 阅读(143) | 评论 (0)编辑 收藏

2015年3月2日

参考dubbo里的NetUtils类

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
import java.util.regex.Pattern;

public class GetIP {
public static void main(String[] args) {
System.out.println(GetIP.getLocalAddress0().getHostAddress());
}
public static InetAddress getLocalAddress0() {
        InetAddress localAddress = null;
        try {
            localAddress = InetAddress.getLocalHost();
            if (isValidAddress(localAddress)) {
                return localAddress;
            }
        } catch (Throwable e) {
            System.out.println("Failed to retriving ip address, " + e.getMessage());
        }
        try {
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            if (interfaces != null) {
                while (interfaces.hasMoreElements()) {
                    try {
                        NetworkInterface network = interfaces.nextElement();
                        Enumeration<InetAddress> addresses = network.getInetAddresses();
                        if (addresses != null) {
                            while (addresses.hasMoreElements()) {
                                try {
                                    InetAddress address = addresses.nextElement();
                                    if (isValidAddress(address)) {
                                        return address;
                                    }
                                } catch (Throwable e) {
                                    System.out.println("Failed to retriving ip address, " + e.getMessage());
                                }
                            }
                        }
                    } catch (Throwable e) {
                        System.out.println("Failed to retriving ip address, " + e.getMessage());
                    }
                }
            }
        } catch (Throwable e) {
            System.out.println("Failed to retriving ip address, " + e.getMessage());
        }
        System.out.println("Could not get local host ip address, will use 127.0.0.1 instead.");
        return localAddress;
    }
    private static boolean isValidAddress(InetAddress address) {
        if (address == null || address.isLoopbackAddress())
            return false;
        String name = address.getHostAddress();
        return (name != null
                && ! ANYHOST.equals(name)
                && ! LOCALHOST.equals(name)
                && IP_PATTERN.matcher(name).matches());
    }
    
    public static final String LOCALHOST = "127.0.0.1";

    public static final String ANYHOST = "0.0.0.0";
    
    private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$");
}

posted @ 2015-03-02 06:29 leekiang 阅读(319) | 评论 (0)编辑 收藏

CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。   
CyclicBarrier  : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。
这样应该就清楚一点了,对于CountDownLatch来说,重点是那个“一个线程”, 是它在等待, 而另外那N的线程在把“某个事情”做完之后可以继续等待,可以终止。而对于CyclicBarrier来说,重点是那N个线程,他们之间任何一个没有完成,所有的线程都必须等待。

CyclicBarrier 在释放等待线程后可以重用,所以称它为循环的 barrier。它 还支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用。



public class Test {
    public static void main(String[] args) {
        new Test().test1();
    }
    
    public void test1() {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(4, new Runnable() {
            @Override
            public void run() {
                System.out.println("所有玩家进入第二关!");
            }
        });

        for (int i = 0; i < 4; i++) {
            new Thread(new Player(i, cyclicBarrier)).start();
        }
    }

    class Player implements Runnable {
        private CyclicBarrier cyclicBarrier;
        private int id;

        public Player(int id, CyclicBarrier cyclicBarrier) {
            this.cyclicBarrier = cyclicBarrier;
            this.id = id;
        }

        @Override
        public void run() {
            try {
                System.out.println("玩家" + id + "正在玩第一关...");
                cyclicBarrier.await();
                System.out.println("玩家" + id + "进入第二关...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }
}

posted @ 2015-03-02 06:28 leekiang 阅读(210) | 评论 (0)编辑 收藏