应用开发

配置开发环境

Windows下搭建开发环境


JDK安装

下载JDK 下载好以后按照提示安装。安装完成后配置环境变量:


JAVA_HOME= D:\Program Files\Java\jdk1.6.0_18(你安装JDK的目录)
CLASSPATH=.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\bin;
Path: 在开始追加 %JAVA_HOME%\bin;

安装完成之后,检查JDK是否安装成功。打开cmd窗口,输入java –version 。
出现下面的画面表示安装成功了:

Eclipse安装

下载Eclipse 选择windows版本进行下载。下载完成后直接解压Eclipse就可以使用了。

安装和配置ADT

ADT是Eclipse用于开发Android应用程序的一个插件。打开eclipse,在菜单栏选择 help->Install New SoftWare->Add
在线安装在Location里面输入地址https://dl-ssl.google.com/android/eclipse/ 。本地安装直接选择压缩包存放路径。

安装Android SDK

下载AndroidSDK 选择适合于自己平台的SDK包(这里是Windows)下载。下载好以后直接解压。接着将SDK配置到Eclipse里去,打开Eclipse选择 Windows > Preferences… 打开编辑属性窗口,选择Android项,在SDK Location里面选择你解压后的Android SDK文件的完整路径。效果如下图所示:

到这里Windows下的Android开发环境基本就搭建好了

创建Android工程

搭建好开发环境之后,先来创建一个TestDemo工程。
1 .选择 File > New > Project
2. 选择 Android > Android Project ,点击 Next
3 .创建一个新的Android工程
这样一个Android的工程就创建完毕了。


Linux下搭建开发环境


linux下sdk下载:http://pan.baidu.com/s/1pJ1hB7t,获取密码:epgk。

linux下ndk下载:http://pan.baidu.com/s/1kTCfiKJ,获取密码:56w5。

JDK安装

修改文件的权限


chmod  777  jdk-6u33-linux-x64.bin

执行安装


./jdk-6u33-linux-x64.bin

接着配置环境变量 在文件/etc/profile中


sudo gedit /etc/profile

在文件末尾添加


JAVA_HOME=/home/test/AndroidTools/eclipse/jdk1.6.0_45 
JRE_HOME=/home/test/AndroidTools/eclipse/jdk1.6.0_45/jre
CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:/home/test/bin
export PATH JAVA_HOME JRE_HOME CLASSPATH

然后在终端运行source /etc/profile,使改动马上生效,运行java -version 可以看到java版本这样环境变量就配置成功了。执行java -version,呈示的结果如下:

Eclipse安装

下载Eclipse 选择linux版本进行下载。下载完成后直接解压Eclipse就可以使用了。

安装和配置ADT

ADT是Eclipse用于开发Android应用程序的一个插件。打开eclipse,在菜单栏选择 help->Install New SoftWare->Add
在线安装在Location里面输入地址https://dl-ssl.google.com/android/eclipse/ 。本地安装直接选择压缩包存放路径。

配置Android SDK

SDK 的配置和JDK大同小异,比JDK的配置更加简单。这里以SDK目录在/home/test/AndroidTools/android-sdk-linux下为例进行配置。首先你已经解压了sdk 目录。然后打开配置文件


sudo gedit /etc/profile 

加入android后的配置文件应该是如下这样的:


JAVA_HOME=/home/test/AndroidTools/eclipse/jdk1.6.0_45   
ANDROID_HOME=/home/test/AndroidTools/android-sdk-linux
JRE_HOME=/home/test/AndroidTools/eclipse/jdk1.6.0_45/jre
CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:/home/test/bin:$ANDROID_HOME/tools
export PATH JAVA_HOME ANDROID_HOME JRE_HOME CLASSPATH

参考以上配置修改自己的。然后保存重启,sdk就配置好了。接着在Eclipse里面配置Android SDK步骤跟Windows里面是一样的。


配置Android NDK

这里以NDK目录在android-ndk-r12b 下为例进行配置,在http://developer.android.com/ndk/downloads/index.html官网下载ndk,根据自己linux的系统选择,此处下载到/home/test/AndroidTools/路径下,下载好后解压,配置环境变量,打开.bashrc进行配置


$ vi .bashrc 

在最后加入NDK的路径:


export NDK_HOME=/home/test/AndroidTools/android-ndk-r12b  
export PATH=$NDK_HOME:$PATH

参考以上配置修改自己的,然后执行以下命令使环境变量配置生效。


$. .bashrc 

IWDS基础应用开发


新建一个android工程,效果如下图所示:

建好工程后你需要导入IWDS的开发jar包,可以直接把iwds-service-ui-jar.jar这两个jar包放进你新建工程的libs文件下。同时你需要把我们用到的libiwds.so文件也拷贝进去。在Eclipse中右键工程根目录,选择Properties -> Java Build Path -> Libraries,然后点击Add External JARs... 选择指向jar的路径,点击OK,即导入成功。(ADT17及以上不需要手动导入)。

iwds-service-ui-jar.jar包配置好了之后就可已正式开发了。

Demo演示用 DataTransactor 在两个设备之间(手机和手表之间)传输数据

1. 两个设备先用 m_transactor.start 启动 DataTransactor。
2. 通过 onLinkConnected 监控设备连接状态,通过 onChannelAvailable 监控蓝牙数据传输通道。如果设备已经连接,数据传输通道有效,就可以传输数据了。
3. 一个设备中用 m_transactor.send(m_weather) 发送数据 m_weather 对象。
4. 另一个设备 onDataArrived(Object object) 收到发送的对象。
5. 结束之后用 m_transactor.stop 关闭 DataTransactor。

注意:需要在两个设备上同时安装这个应用

实例化DataTransactor:
 m_transactor = new DataTransactor(this, this, m_uuid);
启动跟关闭 DataTransactor.

    @Override
    protected void onPause() {
        super.onPause();

        m_transactor.stop();

        IwdsLog.i(this, "onPause");
    }

    @Override
    protected void onResume() {
        super.onResume();

        m_transactor.start();

        IwdsLog.i(this, "onResume");
    }
监控蓝牙传输通道状态,isAvailable 为 true 表示传输通道可用,这时才能传输数据。

    @Override
    public void onChannelAvailable(boolean isAvailable) {
        if (isAvailable) {
            IwdsLog.i(this, "Data channel is available.");

                /* Channel 有效时传输 m_weather 对象 */
            m_transactor.send(m_weather);

        } else {
            IwdsLog.i(this, "Data channel is unavaiable.");
        }
    }

上述DataTransactorDemo源码下载

Demo演示用 FileTransactionModel 在两个设备之间(手机和手表之间)传输文件

发送端的文件路径为 /sdcard/Download/test.zip,此文件必须存在。接收端 文件自动存到 /sdcard/iwds/ 文件夹。
1. 两个设备先用 start 启动 FileTransactionModel
2. 通过 onLinkConnected 监控设备间连接状态,通过 onChannelAvailable 监控蓝牙数据传输通道。如果设备已经连接,数据传输通道有效,就可以传输数据了。
3. 发送端设备中用 requestSendFile() 请求发送文件。
4. 接收端设备在 onRequestSendFile() 确认是否接受该文件。用 notifyConfirmForReceiveFile确认接收文件,用 notifyCancelForReceiveFile 取消文件接收。
5. 发送端设备收到 ConfirmForReceiveFile时发送文件,收到 CancelForReceiveFile则取消文件发送。
6. 文件传输结束后,发送端和接收端都会发生 onSendResult,用以通知传输成功或失败。接收端发生 onFileArrived,通知文件接收完成。

注意:需要在两个设备上同时安装这个应用

实例化FileTransactionModel:

   if (mFileTransactionModel == null)
                mFileTransactionModel = new FileTransactionModel(this, this, UUID);
启动跟关闭 FileTransactionModel

            case R.id.connect_button:
                Log.d(TAG, "MSG_CONNECTING.");
                mHandler.obtainMessage(MSG_CONNECTING).sendToTarget();
                mFileTransactionModel.start();
                mServiceConnected = true;
                break;
            case R.id.disconnect_button:
                Log.d(TAG, "MSG_DISCONNECTING.");
                mHandler.obtainMessage(MSG_DISCONNECTING).sendToTarget();
                mFileTransactionModel.stop();
                mServiceConnected = false;
                break;
发送你要传送的文件:

        case R.id.send_button:
                Log.d(TAG, "MSG_SENDING.");
                mSendCounter = 0;
                mSendNum = getNumber(mIterationsEdit, Integer.MAX_VALUE);
                try {
                    mSendDataType = TYPE_FILE_INFO;
                    mFileTransactionModel.requestSendFile(FILE_PATH);
                    mIsResponse = false;
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                }
                mHandler.obtainMessage(MSG_SENDING).sendToTarget();
                break;
接收端确认是否接收文件(整个连接、传输以及接受等状态都可以通过继承回调接口FileTransactionModelCallback来实时监控):

@Override
    public void onRequestSendFile(FileInfo info) {
        mIsResponse = false;
        mRecvDataType = TYPE_FILE_INFO;
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(R.string.file_transfer);
        builder.setCancelable(false);
        builder.setMessage(FileTransactionActivity.this.getString(R.string.file_name) + ": " + info.name + "\n"
                + FileTransactionActivity.this.getString(R.string.file_size) + ": " + info.length + "bytes");
        builder.setPositiveButton(R.string.confirm,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                            int which) {
                        mFileTransactionModel.notifyConfirmForReceiveFile();
                        mRecvStartTime = System.currentTimeMillis();
                    }
                });
        builder.setNegativeButton(R.string.cancel,
                new DialogInterface.OnClickListener(){
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        mFileTransactionModel.notifyCancelForReceiveFile();
                    }
        });
        builder.create().show();
    }

上述FileTransactionModelDemo源码下载

Demo 演示 用iwds-service-ui-jar.jar和iwds-ui-with-res-jar.jar开发手表的应用

1. 新建一个android工程 例如 iwdsApiDemo源码下载

2. 建好工程后导入开发UI需要到的jar包,直接把 iwds-service-ui-jar.jar,iwds-ui-with-res-jar.jar 这两个jar包放进你新建工程的libs文件下。

3. 在Eclipse导入iwds-ui-res-jar工程。

4. iwdsApiDemo引用iwds-ui-res-jar工程源码,在Eclipse中右键工程根目录,选择Properties -> android,然后点击Add 然后选择iwds-ui-res-jar工程,点击OK。

以下分别描述各个Amazing控件使用方法

1. AmazingDialog 控件


  private AmazingDialog dialog;
  /*创建Dialog*/
  dialog = new AmazingDialog(mContext)
                .setContent(R.string.dialog_content)
                .setNegativeButton(0, new View.OnClickListener() {

                    @Override
                    public void onClick(View arg0) {
                        AmazingToast.showToast(mContext, "Click Cancel",
                                AmazingToast.LENGTH_SHORT,
                                AmazingToast.BOTTOM_CENTER);
                        dialog.dismiss();
                    }
                }).setPositiveButton(0, new View.OnClickListener() {

                    @Override
                    public void onClick(View arg0) {
                        AmazingToast.showToast(mContext, "Click OK",
                                AmazingToast.LENGTH_SHORT,
                                AmazingToast.BOTTOM_CENTER);
                        dialog.dismiss();
                    }
             });
  /*显示对话框*/
  dialog.show();

如图所示

2. AmazingprogressDialog 控件


  private AmazingDialog dialog;
  /*创建AmazingDialog*/
  progressDialog = new AmazingIndeterminateProgressDialog(mContext, getString(R.string.loading));
  progressDialog.setCancelable(true);
  /*显示对话框*/
  progressDialog.show();

如图所示

3. AmazingRingProgressView 控件


package com.ingenic.iwds.apidemo;

import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.ingenic.iwds.widget.AmazingProgressBar;
import com.ingenic.iwds.widget.AmazingProgressBar2;
import com.ingenic.iwds.widget.AmazingRingProgressView;

public class ProgressFragment extends DemoFragment {

    private View mContentView;

    private AmazingProgressBar progressBar;
    private AmazingProgressBar2 progressBar2;
    private AmazingRingProgressView ringProgressView;

    private int mTotalProgress = 100;

    private int mCurrentProgress;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        mContentView = inflater.inflate(R.layout.amazing_progress, null);

        init();

        return mContentView;
    }

    /**
     * 初始化
     */
    private void init() {
        progressBar = (AmazingProgressBar) mContentView.findViewById(R.id.progressbar);
        progressBar2 = (AmazingProgressBar2) mContentView.findViewById(R.id.progressbar2);
        ringProgressView = (AmazingRingProgressView) mContentView
                .findViewById(R.id.ring_progressbar);
        ringProgressView.setPercentEnable(true);
        mHandler.sendEmptyMessageDelayed(0, 100);
    }

    /**
     * 改变进度条进度的Handler
     */
    private Handler mHandler = new Handler() {

        public void handleMessage(android.os.Message msg) {// 不超出最大进度
            if (msg.what == 0 && mCurrentProgress < mTotalProgress) {
                    // 步进值为1
                    mCurrentProgress ++;
                    // 设置进度
                    ringProgressView.setProgress(mCurrentProgress);
                    mHandler.sendEmptyMessageDelayed(0, 10);
            }
        };

    };

    @Override
    public void onDestroyView() {
        if(null!=progressBar){
            progressBar.stop();
        }
        if(null!=progressBar2){
            progressBar2.stop();
        }
        super.onDestroyView();
    }

}

如图所示

4. 其他控件的实现方式,请参考iwdsApiDemo源码,这里不一一列举