Android原生开发笔记

3,943 阅读4分钟

1 使用tcp和C#后端连接

  参考链接


2 基础功能

jsonObject构建json

注意必须放在异常处理块中才可以,否则会报错。

JSONObject jsonObject;
try
{
      jsonObject = new JSONObject();
      jsonObject.put("account",account);
      jsonObject.put("password",password);
      ftpUtil ftpInstance = new ftpUtil(url,jsonObject.toString(),v,0);

}catch (Exception e)
{
    System.out.println(e.fillInStackTrace());
}

Toast显示

Toast.makeText(MainActivity.this, "注册失败", Toast.LENGTH_LONG).show();

销毁活动退出当前界面

activity_register.this.finish();

java字符串比较不使用==

"a".equals("c")  //使用"a" == "a"比较会出现false

3 添加系统应用才有的权限

例如,删除和创建系统文件的权限

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

添加以后,不出意外会报错说

permission only granted to system apps

AS的解决办法是:

File->Settings->Editor->Inspections中Android->Lint->Correctness->(勾划掉)Using system apps

一般和读写系统文件一起使用,注意权限要动态获取

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

4 动态获取权限

android6.0之后,文件系统的读写、定位等权限需要动态获取,这里以sdCard读写权限进行示例,直接看代码

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        checkPermission();
 
    }
 
 
    private void checkPermission() {
 
        //Android平台版本,如我的版本为Android 7.1.2
        Log.v(TAG,"Build.VERSION.RELEASE----->"+Build.VERSION.RELEASE);
        //当前手机版本-API版本号
        Log.v(TAG,"android.os.Build.VERSION.SDK_INT----->"+Build.VERSION.SDK_INT);
        //android 6.0 对应的 API版本号23
        Log.v(TAG,"Build.VERSION_CODES.M----->"+Build.VERSION_CODES.M);
 
 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//android 6.0以上
            Log.v(TAG,"测试手机版本为:android 6.0以上");
 
            int writePermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if (writePermission != PackageManager.PERMISSION_GRANTED) {
                Log.v(TAG,"测试手机版本为:android 6.0以上--->未申请--->申请读写权限");
                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
 
            }else{
                Log.v(TAG,"测试手机版本为:android 6.0以上--->已申请");
            }
        }else{//android 6.0以下
            Log.v(TAG,"测试手机版本为:android 6.0以下");
 
        }
 
    }
 
 
    @Override
    public void onRequestPermissionsResult(int requestCode,  String[] permissions,  int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 100) {
            if (permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE) && grantResults[0]
                    == PackageManager.PERMISSION_GRANTED) {//允许
 
                Log.v(TAG,"测试手机版本为:android 6.0以上--->未申请--->申请读写权限--->成功!");
 
            } else {//拒绝
 
                Log.v(TAG,"测试手机版本为:android 6.0以上--->未申请--->申请读写权限--->失败!");
                Toast.makeText(this, "请赋予读写权限,否则应用将无法使用!", Toast.LENGTH_LONG).show();
                MainActivity.this.finish();
            }
        }
    }

5 android 实现定位获取google map经纬度并展示在baidu map上

定位的坑比较多,android原生定位的监听器响应太慢,调用百度地图的时常返回4.9E-324,这里调用了google服务获取经纬度(不需要翻墙)。

具体代码demo我找了一个写的很好的链接


但是如果需要展示在地图上,因为不同地图使用了不同的坐标系加上国内地图坐标加上了随机偏移,所以需要将经纬度转换成和地图一样的坐标系。

具体哪个地图使用了什么坐标系参见:链接


以google map经纬度转baidu map经纬度为例

第一步,google map经纬度纠偏

public class MapFixUtil {

    final static double pi = 3.14159265358979324;
    final static double a = 6378245.0;
    final static double ee = 0.00669342162296594323;

    public static double[] transform(double wgLat, double wgLon) {
        double[] latlng = new double[2];
        if (outOfChina(wgLat, wgLon)) {
            latlng[0] = wgLat;
            latlng[1] = wgLon;
            return latlng;
        }
        double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);
        double dLon = transformLon(wgLon - 105.0, wgLat - 35.0);
        double radLat = wgLat / 180.0 * pi;
        double magic = Math.sin(radLat);
        magic = 1 - ee * magic * magic;
        double sqrtMagic = Math.sqrt(magic);
        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
        dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
        latlng[0] = wgLat + dLat;
        latlng[1] = wgLon + dLon;
        return latlng;
    }

    private static boolean outOfChina(double lat, double lon) {
        if (lon < 72.004 || lon > 137.8347)
            return true;
        return lat < 0.8293 || lat > 55.8271;
    }

    private static double transformLat(double x, double y) {
        double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
        ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
        ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
        return ret;
    }

    private static double transformLon(double x, double y) {
        double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
        ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
        ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0;
        return ret;
    }

}

第二步,经纬度转成baidu map,公式如下

baiduLng = googleLng + 0.00668
baiduLat = googleLat + 0.00575

6 安卓使用全局变量

第一步,新建application

package com.arcsoft.arcfacedemo.application;
 
import android.app.Application;
 
import com.arcsoft.arcfacedemo.model.FaceRegisterInfo;
 
import java.util.List;
 
public class MyApplication extends Application {
    List<FaceRegisterInfo> faceRegisterInfoList;
 
    public List<FaceRegisterInfo> getFaceRegisterInfoList() {
        return faceRegisterInfoList;
    }
 
    public void setFaceRegisterInfoList(List<FaceRegisterInfo> faceRegisterInfoList) {
        this.faceRegisterInfoList = faceRegisterInfoList;
    }
}

第二步,修改配置文件AndroidManifest.xml,将要运行的应用程序MyApp加进去


第三步,在需要使用的class中添加

 MyApplication application = (MyApplication)this.getApplicationContext();
 List<FaceRegisterInfo> getFaceRegisterInfoList = application.getFaceRegisterInfoList();

7 报错 can not find xx.so

app/build.gradle文件中,android结点添加如下代码

 sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

完整的build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "info.androidhive.androidlocation"
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}

......

8 报错 Execution failed for task ':app:processDebugResources,'

解决办法是,AS打开terminal,windows输入gradlew build,mac输入./gradlew build,定位到具体信息