用eclipse和androidstudio和基于高德地图API开发的附近购平台的java服务端和android客户端数据库用mysql包括程序设计图

来源:互联网 发布:软件技术服务协议范本 编辑:程序博客网 时间:2024/05/18 09:12
android客户端程序界面设计图和功能设计如下,本程序不断完善中,客户端,服务端都在不断修改中
服务端用eclipse工具开发,如下
package xyz.scienceage.www;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.PrintStream;import java.net.ServerSocket;import java.net.Socket;import java.util.Scanner;//正确的服务端public class Server6 {public static void main(String[] args) throws Exception {// TODO 自动生成的方法存根//创建服务端指定端口ServerSocket server = new ServerSocket(8888);System.out.println("服务端已经准备就绪...");boolean accept = true;while(accept){//server accept client object of connecting here,Socket client =server.accept();System.out.println("连接过来的客户端ip"+client.getInetAddress());InputStream in = client.getInputStream();Scanner sc = new Scanner(in);while(sc.hasNext()){String line = sc.nextLine();System.out.println(line);}client.shutdownInput();//关闭输入流而不关闭socketString date = "我是服务端我是服务端我是服务端我是服务端我是服务端我是服务端我是服务端我是服务端";//最后的OutputStream out;out = client.getOutputStream();PrintStream out1 = new PrintStream(out);out1.print(date);out1.close();//流关闭了,socket也会被关闭sc.close();//Scanner关闭后流也关闭了,流关闭了socket也会被关闭client .close();//可以循环让服务端每隔多久发一次信息给客户端,服务端还可以转发A客户端发送到服务器的信息给B客户端//电脑客户端弄个事件,或再用一个手机弄另一个客户端 //解决客户端程序收到服务器发送来的信息,然后展示在客户端上,不晓得客户端收到服务器发送到信息没有//解决手机客户端断网崩溃问题,处理异常//解决发送信息给服务端,服务端去数据库检索,然后返回信息给客户端,客户端把返回的信息接收,读取,然后放到Activity合适的位置上}server.close();}}     
android客户端用androidstudio开发,如下
package com.scienceage.administrator.fujingou;import com.amap.api.location.AMapLocation;import com.amap.api.location.AMapLocationClient;import com.amap.api.location.AMapLocationClientOption;import com.amap.api.location.DPoint;import com.amap.api.maps.AMap;import com.amap.api.maps.CameraUpdate;import com.amap.api.maps.CameraUpdateFactory;import com.amap.api.maps.MapView;import com.amap.api.maps.model.BitmapDescriptorFactory;import com.amap.api.maps.model.LatLng;import com.amap.api.maps.model.Marker;import com.amap.api.maps.model.MarkerOptions;import com.amap.api.maps.model.Text;import com.amap.api.maps.model.TextOptions;import com.amap.api.location.CoordinateConverter;import android.Manifest;import android.app.Activity;import android.content.Context;import android.content.pm.PackageManager;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.support.v4.app.ActivityCompat;import android.util.Log;import android.view.View;import android.widget.CompoundButton;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import android.widget.ToggleButton;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.PrintStream;import java.net.Socket;import java.util.Scanner;import static android.R.attr.lines;import static android.R.attr.port;import static android.icu.lang.UCharacter.GraphemeClusterBreak.T;import static com.scienceage.administrator.fujingou.R.id.dianji;public class MainActivity extends Activity {//创建MainActivity继承于Activity    public AMapLocationClientOption mLocationOption = null;    private MapView mMapView;//申明一个MapView类型的名为mMapView的对象变量,没有初始化,默认为null    private AMap aMap;//申明一个AMap类型的名为aMap的对象变量,没有初始化,默认为null    private Context context;    Socket socket;    String gongxiang = "nihao";//两个线程的共享资源    private LocationManager locationManager;//申明一个LocationManager(安卓的定位的类) 类型的名为locationManager的对象变量,没有初始化,默认为null//onCreare相当于主方法,它里面才是要执行的程序    @Override    protected void onCreate(Bundle savedInstanceState) {//创建一个无返回的onCreate方法,参数是Bundle类型的 savedInstanceState,,,,,onCreat里才是activity创建时执行的程序,之外的方法是需要在onCreate里调用才会执行        super.onCreate(savedInstanceState);//调用父类的onCreate方法,参数是savedInstanceState        setContentView(R.layout.activity_main);//调用父类的setContentView方法设置要启动的Activity,activity_main就是布局里要启动的activity的名字        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);//用getSystemService得到系统服务的方法(需要传入服务类型)得到object对象,它的真实类型是LocationManager,强转成这个类型对象        //getSystemService(Context.LOCATION_SERVICE)方法里参数必须传入Context这个类名调用的它内部对应的各种服务的静态常量        mMapView = (MapView) findViewById(R.id.map);//用findViewById方法得到Viewt对象,它的真实类型是MapView,强转成这个类型对象        mMapView.onCreate(savedInstanceState);//mMapView地图容器创建        init();//初始化AMap对象        //GPRS提供的定位信息改变        context = getApplicationContext();//用这个方法获取context实例//监听就是自己调用自己,设定暂停时间,每隔多久就又开始运行本方法        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 333, 8, new LocationListener() {//new LocationListener()是匿名内部类返回一个LocationListener类型的匿名对象(相当于实现它的子类的对象)//匿名内部类也可以外面写个类然后实现LocationListener接口,然后创建一个对象就可以用了            //监听程序的内部执行顺序流程,用debug进入方法里面看            @Override            public void onStatusChanged(String provider, int status, Bundle extras) {//实现接口的类必须复写接口中的全部方法            }            @Override            public void onProviderEnabled(String provider) {            }            @Override            public void onProviderDisabled(String provider) {            }            @Override            public void onLocationChanged(Location location) {//这个方法又被前面哪一个方法调用和传入参数呢                updatePosition(location);//调用下面更新位置的方法            }        });//可以把位置传给服务器保存起来,先申请注册账户密码,保存到数据库,然后传产品位置名称图片等到账户店铺下,然后流动摊贩产品位置是用的流动摊贩手机位置,每隔1秒更新一次到服务器。固定商铺仓库产品位置不变。任何人可以搜索所有产品。//这里可以通过搜索框控件和按钮从服务器获得一个产品的位置,名称图片等然后展示出来        //获取产品名称,位置,价格,品牌,各种参数等,图片地址,图片,视频,语音,数据库表头可以设置多少列        ToggleButton tb = (ToggleButton) findViewById(R.id.tb);        tb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){            @Override            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                // TODO Auto-generated method stub                if(isChecked){                    aMap.setMapType(AMap.MAP_TYPE_SATELLITE);                }else{                    aMap.setMapType(AMap.MAP_TYPE_NORMAL);                }            }        });    }    //实践通过点击启动方法里调用方法,第二次启动又需要传入View点击    public void dianJi(View view){//按钮测试,点击按钮弹出提示信息        Toast toast = Toast.makeText(MainActivity.this, "简单的提示信息", Toast.LENGTH_SHORT);        toast.show();    }    public void faSong(View view){//faSong演示,先把服务端打开,在点击客户端,,安卓中网络编程需要单独开线程,不然会报异常           new Thread(new Runnable() {               @Override               public void run() {                   try {                       socket = new Socket("192.168.1.254", 8888);                   } catch (IOException e) {                       Toast toast1 = Toast.makeText(MainActivity.this, "异常", Toast.LENGTH_SHORT);                       toast1.show();                   }               }           } ).start();//匿名内部类开启线程        Toast toast = Toast.makeText(MainActivity.this, "开起线程成功", Toast.LENGTH_SHORT);//开启线程后,本faSong演示方法内的语句程序会执行完。        toast.show();    }    public void souSuo(View view){//souSuo按钮演示,先把服务端打开,在点击客户端,,安卓中网络编程需要单独开线程,不然会报异常        Log.v("xjj", "This is Verbose.");//安卓子线程不能操作主线程UI,只能线程通讯,传数据给共享资源,然后主线程去共享资源取数据        Log.d("xjj", "This is Debug.");        Log.i("xjj", "This is Information");        Log.w("xjj", "This is Warnning.");        Log.e("xjj", "This is Error.");        new Thread(new Runnable() {            @Override            public void run() {                try {                    socket = new Socket("192.168.1.254", 8888);                    //获取文本框内容                    String str1="";                    EditText editText1 =(EditText)findViewById(R.id.editText);                    str1=editText1.getText().toString();                    OutputStream out1 = socket.getOutputStream();                    PrintStream out2 = new PrintStream(out1);                    out2.print( str1);//发送给服务端                 socket.shutdownOutput();//关闭输出流而不关闭socket                    InputStream in = socket.getInputStream();                    Log.d("xjj","This connect success");                    byte[] b = new byte[1024];                    int ret =in.read(b);                    String st = new String(b,0,ret);                    gongxiang = st;                    Log.d("xjj",st);                    in.close();                    socket.close();//关闭socket                } catch (IOException e) {                    Toast toast1 = Toast.makeText(MainActivity.this, "异常", Toast.LENGTH_SHORT);                    toast1.show();                }            }        } ).start();//匿名内部类开启线程        Toast toast = Toast.makeText(MainActivity.this, "开起线程成功", Toast.LENGTH_SHORT);//开启线程后,本faSong演示方法内的语句程序会执行完。       toast.show();//这个显示提示信息的不能用在线程内部的部用,不然程序会崩溃关闭。        try {            Thread.sleep(2000);//dianji点击按钮后,子线程启动后执行,同时让本次点击的主线程的睡一下        } catch (InterruptedException e) {            Toast toast1 = Toast.makeText(MainActivity.this, "异常", Toast.LENGTH_SHORT);            toast1.show();        }        tiHuan(gongxiang);//线程怎么通讯,子线程传递数据进入共享资源String gongxiang后,点击后触发的主线程tiHuan(gongxiang)才执行,主线程操作主activity,子线程能操作ui和主activity吗。    }public void tiHuan(String l){//创建一个输入一个String能替换原来textview文本的方法        TextView text1 =(TextView)findViewById(R.id.text);        String  s = (String) text1.getText();        String b = "需要替换的";        if (s.equals(b) ){            text1.setText(l);}else{            text1.setText("需要替换的");        }    }    //初始化AMap对象    private void init(){        if(aMap == null){            aMap = mMapView.getMap();        }    }    @Override    protected void onDestroy() {        // TODO Auto-generated method stub        super.onDestroy();        mMapView.onDestroy();    }    @Override    protected void onPause() {        // TODO Auto-generated method stub        super.onPause();        mMapView.onPause();    }    @Override    protected void onResume() {        // TODO Auto-generated method stub        super.onResume();        mMapView.onResume();    }    @Override    protected void onSaveInstanceState(Bundle outState) {        // TODO Auto-generated method stub        super.onSaveInstanceState(outState);        mMapView.onSaveInstanceState(outState);    }    public LatLng zhunhuan(Location location) {//把gps坐标转换成符合高德的坐标        AMapLocation aMapLocation = new AMapLocation(location);        CoordinateConverter coordinateConverter = new CoordinateConverter(context);        CoordinateConverter coordinateConverter1 = coordinateConverter.from(CoordinateConverter.CoordType.GPS);        DPoint dPoint = new DPoint(aMapLocation.getLatitude(), aMapLocation.getLongitude());        LatLng pos1 = null;        try {            CoordinateConverter coordinateConverter2 = coordinateConverter1.coord(dPoint);            DPoint dPoint1 = coordinateConverter2.convert();            pos1 = new LatLng(dPoint1.getLatitude(), dPoint1.getLongitude());        } catch (Exception e) {        }        return pos1;    }    private void updatePosition(Location location){        if(location != null){            LatLng pos1 = zhunhuan(location);            LatLng pos = new LatLng(location.getLatitude(), location.getLongitude());//根据传入的location得到经纬度,然后根据经纬度创建一个LatLng对象,这条暂时没用        //创建一个设置经纬度的CameraUpdate        CameraUpdate cu = CameraUpdateFactory.changeLatLng(pos1);        //更新地图的显示区域        aMap.moveCamera(cu);//调用moveCamera方法可以更新显示区域,但是需要传入一个CameraUpdate类型对象,把地图界面移动到定位中心。怎么实现点击定位按钮移动到定位中心,刚开机移动到定位点,等会第二次更新位置就不用移动到定位点        //怎么实现标记可以点击,然后进入店铺或宝贝排序页面,或者搜索后弹出半栏显示宝贝详细信息,即时位置,如果宝贝是流动摊贩,宝贝就会随着流动摊贩动        //清除所有的Marker等覆盖物        aMap.clear();        //创建一个MarkerOptions对象        MarkerOptions markOptions = new MarkerOptions();//            MarkerOptions markOptions1 =  markOptions.position(pos1);//        //添加MarkerOptions(实际上是添加Marker)        Marker marker = aMap.addMarker(markOptions1);//            TextOptions text = new TextOptions();//            TextOptions text1 = text.text("你好文字马克,这就是标注"+gongxiang);//把多个线程共享的资源的内容放到产品在地图的定位点上。            TextOptions text2 =  text1.position(pos1);//            Text text3 = aMap.addText(text2);            MarkerOptions    markerOption = new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.zidingyi))                    .position(pos1)                    .draggable(true);            marker = aMap.addMarker(markerOption);            LatLng pos2 = new LatLng(location.getLatitude()+1, location.getLongitude()+1);            MarkerOptions    markerOption2 = new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher_round))                    .position(pos2)                    .draggable(true);            marker = aMap.addMarker(markerOption2);        }    }}//在监听程序里调用所有需要和监听一起变化的方法,监听设置了时间,相当于循环,每隔多少毫秒就进行一次更新,每次循环完需要释放上一次循环占用的内存,避免内存耗完后死机

客户端布局androidstudio中开发,如下

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    >    <com.amap.api.maps.MapView        android:id="@+id/map"        android:layout_width="match_parent"        android:layout_height="match_parent"></com.amap.api.maps.MapView>    <EditText        android:id="@+id/editText"        android:layout_width="330dp"        android:layout_height="wrap_content"        android:ems="10"        android:inputType="textPersonName"        android:text="" />    <TextView        android:id="@+id/text"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:text="需要替换的"  />    <Button        android:id="@+id/button2"        android:onClick="souSuo"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="right"        android:text="搜索" />    <Button        android:id="@+id/button5"        android:onClick="faSong"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="end|center"        android:text="发送信息" />    <Button        android:onClick="dianJi"        android:id="@+id/dianji"        android:text="弹信息"        android:layout_gravity="bottom|right"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />    <Button        android:id="@+id/button3"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="bottom"        android:text="定位" />    <ToggleButton        android:id="@+id/tb"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="left|center"        android:textOff="普通地图"        android:textOn="卫星地图"        android:checked="false"        android:background="@android:color/transparent"  />
客户端AndroidManifest用androidstudio开发,如下

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.scienceage.administrator.fujingou">    <!--允许程序打开网络套接字-->    <uses-permission android:name="android.permission.INTERNET" />    <!--允许程序设置内置sd卡的写权限-->    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <!--允许程序获取网络状态-->    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <!--允许程序访问WiFi网络信息-->    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <!--允许程序读写手机状态和身份-->    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <!--允许程序访问CellID或WiFi热点来获取粗略的位置-->    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />    <!--用于访问GPS定位-->    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>    <!--用于申请调用A-GPS模块-->    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:roundIcon="@mipmap/ic_launcher_round"        android:supportsRtl="true"        android:theme="@android:style/Theme.NoTitleBar">        <service android:name="com.amap.api.location.APSService"/>        <!--不显12示应用程序标题栏的theme-->        <meta-data            android:name="com.amap.api.v2.apikey"            android:value="eda3eddfff4c400a1965fa3109e473b3"/>        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application>
</manifest>


阅读全文
0 0