Google API实战与操作

Google官网

实现一套用java程序控制GoogleAPI实现自动生成监控日报等功能,具体能操作Gsheet及document

一. Google API 权限配置

打开上面官网,新建项目
在这里插入图片描述
启用API
在这里插入图片描述
搜索sheet及document
在这里插入图片描述

在这里插入图片描述.点击试用后进入API界面 点击创建凭据
在这里插入图片描述
创建OAuth 客户端重定向记得跟下面配置一样,因为需要先登录才能授权
在这里插入图片描述
生成完成后点击下载到本地,相当于你的Token
在这里插入图片描述

这时候就可以生成表格了

二. 操作API

2.1 引入依赖
<!--        google文档-->
        <dependency>
            <groupId>com.google.api-client</groupId>
            <artifactId>google-api-client</artifactId>
            <version>1.31.2</version>
        </dependency>
        <dependency>
            <groupId>com.google.apis</groupId>
            <artifactId>google-api-services-sheets</artifactId>
            <version>v4-rev614-1.18.0-rc</version>
        </dependency>
        <dependency>
            <groupId>com.google.oauth-client</groupId>
            <artifactId>google-oauth-client-jetty</artifactId>
            <version>1.31.4</version>
        </dependency>
        <dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>google-cloud-storage</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.apis/google-api-services-drive -->
        <dependency>
            <groupId>com.google.apis</groupId>
            <artifactId>google-api-services-drive</artifactId>
            <version>v3-rev197-1.25.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.apis</groupId>
            <artifactId>google-api-services-docs</artifactId>
            <version>v1-rev20220609-2.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.gitlab4j</groupId>
            <artifactId>gitlab4j-api</artifactId>
            <version>5.2.0</version>
        </dependency>
        <dependency>
                <groupId>com.google.cloud</groupId>
                <artifactId>libraries-bom</artifactId>
                <version>25.4.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

将上面生成的Token导入项目

2.2 导入代码
package com.shopee.bank.business.utility;

import com.baomidou.mybatisplus.extension.api.R;
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.docs.v1.Docs;
import com.google.api.services.docs.v1.DocsScopes;
import com.google.api.services.docs.v1.model.*;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.Spreadsheet;
import com.google.api.services.sheets.v4.model.SpreadsheetProperties;
import com.google.api.services.sheets.v4.model.UpdateValuesResponse;
import com.google.api.services.sheets.v4.model.ValueRange;
import com.google.common.collect.Lists;
import io.swagger.models.auth.In;
import lombok.Builder;
import lombok.Data;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author kaiyi.wang
 * @ClassName GoogleSheetUtil.java
 * @Description
 * @createTime 2022/07/05
 */
public class GoogleUtil {

    private static final String APPLICATION_NAME = "Quickstart";
    private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
    private static final String TOKENS_DIRECTORY_PATH = "tokens";

    private static final List<String> SCOPES_READ = Lists.newArrayList(SheetsScopes.SPREADSHEETS_READONLY);
    private static final List<String> SCOPES_CREATE = Lists.newArrayList(SheetsScopes.SPREADSHEETS,DriveScopes.DRIVE_FILE);

    private static final List<String> DOCS_SCOPES = Lists.newArrayList(DocsScopes.all());


    public static final String PHFoldID="1msqpxxxxx9vx82Cln";
    public static final String IDFoldID="1VyxuzHxxxxxxxHR";


    /**
     * TODO 下载的应用授权文件,这里记得换成自己的授权文件
     */
    private static final String CREDENTIALS_FILE_PATH = "/credentials.json";

    private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT,List<String> scopes) throws IOException {
        // Load client secrets.
        InputStream in = GoogleUtil.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
        if (in == null) {
            throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
        }
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, scopes)
                .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
                .setAccessType("offline")
                .build();
        LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
        return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
    }

    public static void main(String[] args) throws IOException, GeneralSecurityException {
//       
        createSpreadsheet("测试");
//      
    }

    public static String createSpreadsheet(String title) throws IOException, GeneralSecurityException {
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        // Create the sheets API client
        Sheets service = new Sheets.Builder(new NetHttpTransport(),
                GsonFactory.getDefaultInstance(),
                getCredentials(HTTP_TRANSPORT,SCOPES_CREATE))
                .setApplicationName("Sheets samples")
                .build();
        // Create new spreadsheet with a title
        Spreadsheet spreadsheet = new Spreadsheet()
                .setProperties(new SpreadsheetProperties()
                        .setTitle(title));
        spreadsheet = service.spreadsheets().create(spreadsheet)
                .setFields("spreadsheetId")
                .execute();
        // Prints the new spreadsheet id
        System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId());
        return spreadsheet.getSpreadsheetId();
    }

        public static void updateSheet(String sid,List<List<Object>> writeData,String dimension,String writeRange) throws IOException, GeneralSecurityException {
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        // Create the sheets API client
        Sheets service = new Sheets.Builder(new NetHttpTransport(),
                GsonFactory.getDefaultInstance(),
                getCredentials(HTTP_TRANSPORT,SCOPES_CREATE))
                .setApplicationName("Sheets samples")
                .build();
        writeSomething(writeData, service, sid,dimension,writeRange);
    }

    //COLUMNS / ROWS
    public static void writeSomething(List<List<Object>> myData, Sheets service, String sid,String dimension,String writeRange) {
        try {
//            String writeRange = "工作表1!A:F";
            ValueRange vr = new ValueRange().setValues(myData).setMajorDimension(dimension);
            UpdateValuesResponse raw = service.spreadsheets().values()
                    .update(sid, writeRange, vr)
                    .setValueInputOption("RAW")
                    .execute();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Data
    @Builder
    public static class VInfo{
        private String name;
        private String count;
    }

    /**
     * A1 符号
     * 一种语法,用于使用包含工作表名称以及使用列字母和行号的开始和结束单元格坐标的字符串来定义单元格或单元格范围。在引用绝对范围的单元格时,此方法最常见且最有用。
     *
     * 显示示例
     * Sheet1!A1:B2指的是 Sheet1 前两行中的前两个单元格。
     * Sheet1!A:A指 Sheet1 第一列中的所有单元格。
     * Sheet1!1:2指 Sheet1 前两行中的所有单元格。
     * Sheet1!A5:A指的是工作表 1 第一列的所有单元格,从第 5 行开始。
     * A1:B2指第一个可见工作表的前两行中的前两个单元格。
     * Sheet1指 Sheet1 中的所有单元格。
     * 'My Custom Sheet'!A:A指名为“我的自定义工作表”的工作表第一列中的所有单元格。带有空格、特殊字符或字母数字组合的工作表名称需要单引号。
     * 'My Custom Sheet'指“我的自定义工作表”中的所有单元格。
     * 提示:在可能的情况下,为电子表格中的对象使用不同的名称。例如,A1 指的是第一个可见工作表中的单元格 A1,而“A1”指的是名为 A1 的工作表中的所有单元格。同样,Sheet1 引用 Sheet1 中的所有单元格。但是,如果有一个名为“Sheet1”的命名范围,则 Sheet1 指的是命名范围,而“Sheet1”指的是工作表。
     * @throws GeneralSecurityException
     * @throws IOException
     */

    // 读取电子表格
    public static void readSheet() throws GeneralSecurityException, IOException {
        // Build a new authorized API client service.
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        final String spreadsheetId = "1XiZZT2ctZ8JMjGy2GYOPmsat5CD24U9r0wo6vro-z9Q";    // 这个是官方的 spreadsheetId,读取自己的Google Sheet换成对应ID即可
        final String range = "aml_process_tab!A1:F12"; // 读取的表格范围,命名规范: {sheet表名称}!{开始单元格}:{结束单元格}
        Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT,SCOPES_READ))
                .setApplicationName(APPLICATION_NAME)
                .build();

        ValueRange response = service.spreadsheets().values()
                .get(spreadsheetId, range)
                .execute();
        List<List<Object>> values = response.getValues();
        if (values == null || values.isEmpty()) {
            System.out.println("No data found.");
        } else {
            for (List row : values) {
                for (int i = 0; i < row.size(); i++) {
                    System.out.print(row.get(i) + "\t\t");
                }
                System.out.println("");
            }
        }
    }

    public static List<String> moveFileToFolder(String fileId, String folderId)
            throws IOException, GeneralSecurityException {
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();

        Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT,SCOPES_CREATE))
                .setApplicationName(APPLICATION_NAME)
                .build();

        // Retrieve the existing parents to remove
        File file = service.files().get(fileId)
                .setFields("parents")
                .execute();
        StringBuilder previousParents = new StringBuilder();
        for (String parent : file.getParents()) {
            previousParents.append(parent);
            previousParents.append(',');
        }
        try{
            // Move the file to the new folder
            file = service.files().update(fileId, null)
                    .setAddParents(folderId)
                    .setRemoveParents(previousParents.toString())
                    .setFields("id, parents")
                    .execute();

            return file.getParents();
        }catch (GoogleJsonResponseException e) {
            // TODO(developer) - handle error appropriately
            System.err.println("Unable to move file: " + e.getDetails());
            throw e;
        }
    }



    /**
     * 复制文件到目标目录下
     * @param documentId 目标docs
     * @param foldID 迁移目录
     * @param copyName 复制文件后的名字
     * @throws GeneralSecurityException
     * @throws IOException
     */
    public static String copyDocs(String documentId,String foldID,String copyName) throws GeneralSecurityException, IOException {
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
//        Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT,DOCS_SCOPES))
//                .setApplicationName(APPLICATION_NAME)
//                .build();
        Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT,DOCS_SCOPES))
                .setApplicationName(APPLICATION_NAME)
                .build();
        File copyMetadata = new File().setName(copyName);
        File documentCopyFile =
                service.files().copy(documentId, copyMetadata).execute();
        String documentCopyId = documentCopyFile.getId();
        moveFileToFolder(documentCopyId, foldID);
        return documentCopyId;
    }

    private static Docs getDocsService()  {
        final NetHttpTransport HTTP_TRANSPORT;
        Docs service;
        try {
            HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
            service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT,DOCS_SCOPES))
                    .setApplicationName(APPLICATION_NAME)
                    .build();
        } catch (GeneralSecurityException | IOException e) {
            throw new RuntimeException(e);
        }
        return service;
    }

    /**
     * 指定索引处插入文本
     * @param docsId
     * @param index 文字的索引 从0开始
     * @param text 插入文本
     * @throws IOException
     */
    public static void updateDocs(String docsId, Integer index, String text) throws IOException {
        Docs service = getDocsService();
        List<Request> requests = new ArrayList<>();
        requests.add(new Request().setInsertText(new InsertTextRequest()
//                .setText("07.18~07.24")
                .setText(text)
//                .setLocation(new Location().setIndex(2))));
                .setLocation(new Location().setIndex(index))));

        BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest().setRequests(requests);
        BatchUpdateDocumentResponse response = service.documents()
                .batchUpdate(docsId, body).execute();
        System.out.println("updated: "+response.getDocumentId());
    }

    /**
     * 最末尾处插入空表格
     * @param docsId
     * @throws IOException
     */
    public static void insertSheetInDocs(String docsId) throws IOException {
        Docs service = getDocsService();

        List<Request> requests = new ArrayList<>();
        requests.add(
                new Request()
                        .setInsertTable(
                                new InsertTableRequest()
                                        .setEndOfSegmentLocation(
                                                new EndOfSegmentLocation())
                                        .setRows(3)
                                        .setColumns(3)));

        BatchUpdateDocumentRequest body =
                new BatchUpdateDocumentRequest().setRequests(requests);
        BatchUpdateDocumentResponse response =
                service.documents().batchUpdate(docsId, body).execute();
    }

    /**
     * docs中表格插入数据 必须倒着写不然索引会变(代码内已处理)
     * @param docsId 操作文档
     * @param indexOfTable 文档中第几个表
     * @param data 行数据
     * @param row 写入第几行数据 注意第一可能为标题
     * @throws IOException 表格若有数据会报错
     */
    public static void updateDocsSheetRow(String docsId,Integer indexOfTable,List<Object> data,int row) throws IOException {
        Docs service = getDocsService();
        // 获取结构
        Document document = service.documents().get(docsId).execute();

        List<StructuralElement> tables = document.getBody().getContent().stream().filter(e -> e.getTable() != null).collect(Collectors.toList());
        if(indexOfTable>=tables.size()){
            throw new IllegalArgumentException("out of size");
        }
        // 获取table
        StructuralElement table = tables.get(indexOfTable);
        // 拿到table行索引
        List<Integer> indexs = table.getTable().getTableRows().get(row).getTableCells().stream().map(TableCell::getStartIndex).collect(Collectors.toList());
        Collections.reverse(indexs);
        Collections.reverse(data);

        List<Request> requests = insertRowList(indexs, data);

        BatchUpdateDocumentRequest body =
                new BatchUpdateDocumentRequest().setRequests(requests);
        BatchUpdateDocumentResponse response = service.documents()
                .batchUpdate(docsId, body).execute();
    }

    public static List<Request> insertRowList(List<Integer> reIndex,List<Object> rowData){
        int i=0;
        List<Request> rows=new ArrayList<>();
        for (Object e : rowData) {
            Request request = new Request().setInsertText(new InsertTextRequest()
                    .setText(String.valueOf(e))
                    .setLocation(new Location().setIndex(reIndex.get(i++)+1)));
            rows.add(request);
        }
//        Collections.reverse(rows);
        return rows;
    }

}

注释都有 凑活看看 下次详细讲解 拉取Grafana自动生成报表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介   《Android开发入门与实战》内容上涵盖了用Android开发的大部分场景,从Android基础介绍、环境搭建、SDK介绍、Market使用,到应用剖析、组件介绍、实例演示等方面。从技术实现上,讲解了5个Android平台下的完整综合实例及源代码分析,分别是RSS阅读器、基于Google Map的个人GPS、豆瓣网(Web 2.0)客户端、在线音乐播放器、手机信息查看助手。《Android开发入门与实战》注重对实际动手能力的指导,在遵循技术研发知识体系的严密性同时,在容易产生错误、不易理解的环节配以了翔实的开发情景截图,并将重要的知识点和开发技巧以“小实验”、“小提醒”、“小知识”、“注意”等的活泼形式呈现给读者。在程序实例的讲解方面,主要将实例安插在Android开发的精髓知识章节,这为初学者学习与实践结合提供了很好的指导。《Android开发入门与实战》配套有400多分钟的全程开发视频光盘,指导读者快速、无障碍地学通Android实战开发技术。《Android开发入门与实战》适合具备一定软件开发经验,想快速进入Android开发领域的程序员;具备一些手机开发经验的开发者和Android开发爱好者学习用书;也适合作为相关培训学校的Android培训教材。 目录 第1章 掀起你的盖头来——初识Android 1.1 认识Android 1.2 Android的背景 1.2.1 Android的历史 1.2.2 Android的发展 1.3 我的Android我做主 1.3.1 开发基于Android平台的应用 1.3.2 参加Android开发者大赛 1.3.3 个人英雄主义再现——得到更多人的认可和尊重 1.3.4 获得应有的收益——AndroidMarket 1.4 真实体验——Android模拟器 1.4.1 模拟器概述 1.4.2 模拟器和真机的区别 1.4.3 模拟器使用注意事项 1.5 更上一层楼——加入Android开发社区 1.6 本章小结 第2章 工欲善其事 必先利其器——搭建Android开发环境 2.1 开发Android应用前的准备 2.1.1 Android开发系统要求 2.1.2 Android软件开发包 2.1.3 其他注意事项 2.2 Windows开发环境搭建 2.2.1 JDK、Eclipse、AndroidSDK软件安装 2.2.2 SDK的家在哪里——设定AndroidSDKHome 2.2.3 真的准备好了吗——开发环境验证 2.2.4 创建Android虚拟设备(AVD) 2.3 Linux一族——Ubuntu开发环境搭建 2.3.1 Java、Eclipse和ADT插件安装 2.3.2 设定AndroidSDKHome 2.4 MacOS一族——苹果开发环境搭建 2.5 本章小结 第3章 清点可用资本——AndroidSDK介绍 3.1 AndroidSDK基础 3.2 深入探寻AndroidSDK的密码 3.2.1 AndroidSDK目录结构 3.2.2 android.jar及内部结构 3.2.3 SDK文档及阅读技巧 3.2.4 先来热热身——AndroidSDK例子解析 3.2.5 SDK提供的工具介绍 3.3 Android典型包分析 3.3.1 开发的基石——AndroidAPI核心开发包介绍 3.3.2 拓展开发外延——Android可选API介绍 3.4 本章小结 第4章 赚钱的市场——AndroidMarket及应用发布 4.1 GoogleMarket产生背景与目的 4.2 体验“选货”的乐趣——在G1上体验Market的使用 4.3 Android开发活动及特色应用 4.3.1 开发应用的领域 4.3.2 AndroidMarket特色应用一览 4.4 你也可以做东家——申请Market账号 4.4.1 卖东西要先入伙——准备工作 4.4.2 入伙过程——申请 4.5 开张了——在Market上发布应用 4.5.1 发布时可能遇到的错误 4.5.2 卖东西也要签名——生成签名文件 4.5.3 打包、签名、发布应用 4.6 本章小结 第5章 千里之行始于足下——第一个应用HelloWorld 5.1 HelloWorld应用分析 5.1.1 新建一个Android工程 5.1.2 填写工程的信息 5.1.3 编程实现 5.1.4 运行项目 5.2 调试项目 5.2.1 设置断点 5.2.2 Debug项目 5.2.3 断点调试 5.3 本章小结 第6章 磨刀不误砍柴工——Android应用程序结构介绍 6.1 Android体系结构介绍 6.1.1 应用程序(Application) 6.1.2 应用程序框架(ApplicationFramework) 6.1.3 库(Libraries)和运行环境(RunTime) 6.2 Android应用程序组成 6.2.1 Activity介绍 6.2.2 BroadcastIntentReceiver介绍 6.2.3 Service介绍 6.2.4 ContentProvider介绍 6.3 Android应用工程文件组成 6.4 本章小结 第7章 良好的学习开端——Android基本组件介绍 7.1 第一印象很重要——界面UI元素介绍 7.1.1 视图组件(View) 7.1.2 视图容器组件(Viewgroup) 7.1.3 布局组件(Layout) 7.1.4 布局参数(LayoutParams) 7.2 我的美丽我做主——Android中应用界面布局 7.2.1 实例操作演示 7.2.2 实例编程实现 7.3 不积跬步无以至千里——常用widget组件介绍 7.3.1 创建widget组件实例 7.3.2 按钮(Button)介绍与应用 7.3.3 文本框(TextView)介绍与应用 7.3.4 编辑框(EditText)介绍与应用 7.3.5 多项选择(CheckBox)介绍与应用 7.3.6 单项选择(RadioGroup)介绍与应用 7.3.7 下拉列表(Spinner)介绍与应用 7.3.8 自动完成文本(AutoCompleteTextView) 7.3.9 日期选择器(DatePicker)介绍与应用 7.3.10 时间选择器(TimePicker)介绍与应用 7.3.11 滚动视图(ScrollView)介绍与应用 7.3.12 进度条(ProgressBar)介绍与应用 7.3.13 拖动条(SeekBar)介绍与应用 7.3.14 评分组件(RatingBar)介绍与应用 7.3.15 图片视图(ImageView)介绍与应用 7.3.16 图片按钮(ImageButton)介绍与应用 7.3.17 切换图片(ImageSwitcher&Gallery) 7.3.18 网格视图(GridView)介绍与应用 7.3.19 标签(Tab)介绍与应用 7.4 友好的菜单——menu介绍与实例 7.4.1 实例操作演示 7.4.2 实例编程实现 7.5 Android应用的灵魂——Intent和Activity介绍与实例 7.5.1 实例操作演示 7.5.2 实例编程实现 7.6 用好列表,做好程序——列表(ListView)介绍与实例 7.6.1 实例程序演示 7.6.2 实例编程实现 7.7 友好地互动交流——对话框(Dialog)介绍与实例 7.8 温馨的提醒——Toast和Notification应用 7.8.1 实例操作演示 7.8.2 实例编程实现 7.9 本章小结 第8章 移动信息仓库——Android的数据存储操作 8.1 Android数据存储概述 8.2 轻轻地我保护——SharedPreferences存储 8.3 谁的文件,谁主宰——文件存储 8.4 打造自己的数据库存储——SQLite存储方式 8.4.1 Android中对数据库操作 8.4.2 完整地操作数据库——日记本实例 8.5 我的数据你来用——ContentProvider介绍 8.5.1 初识ContentProvider 8.5.2 使用ContentProvider读取系统数据 8.5.3 使用ContentProvider操作数据日记本实例 8.6 再学一招——网络存储 8.7 本章小结 第9章 我来“广播”你的“意图”——Intent和Broadcast面对面 9.1 Android应用程序的核心——Intent 9.1.1 Intent基础 9.1.2 用Intent启动一个新的Activity 9.1.3 Intent详细讲解 9.1.4 Android解析Intent实现 9.2 用广播告诉你——利用Intent来广播(BroadCast)事件 9.2.1 实现Android中的广播事件 9.2.2 BroadCastReceiver介绍 9.3 应用实例详解 9.3.1 程序操作演示 9.3.2 实例编程实现 9.4 本章小结 第10章 一切为用户服务——Service应用实例 10.1 认识Service 10.2 使用Service 10.3 Service的生命周期 10.4 实例学习Service 10.4.1 精彩实例一——定时提醒 10.4.2 精彩实例二——音乐播放器 10.5 本章小结 第11章 循序渐进——开发Android应用的基本步骤 11.1 兵马未动粮草先行——应用规划及架构设计 11.2 应用开发步骤 11.2.1 界面设计始终是第一位——实现UI 11.2.2 必备的动力源泉——数据操作和存储 11.2.3 华丽转身——实现多页面跳转 11.2.4 始终为用户做好服务——增加Service 11.2.5 细节决定成败——完善应用细节 11.3 成功就在眼前——应用测试和发布 11.3.1只欠东风——应用测试 11.3.2 可以赚钱了——发布到AndroidMarket 11.4 本章小结 第12章 Android综合案例一——RSS阅读器实例 12.1 RSS介绍 12.1.1 RSS基础 12.1.2 RSS的历史 12.1.3 RSS语法介绍 12.2 SAX介绍 12.2.1 SAX基础 12.2.2 使用SAX的作用 12.2.3 怎样使用SAX 12.3 RSS阅读器设计 12.3.1 RSS阅读器功能设计 12.3.2 RSS阅读器UI和交互流程设计 12.4 RSS阅读器的实现 12.4.1 程序实体解析 12.4.2 实现一个自己的ContentHandler 12.4.3 Activity的实现 12.5 本章小结 第13章 Android综合案例二——基于GoogleMap开发个人移动地图 13.1 项目UI规划 13.2 数据存储实现 13.2.1 设计数据库及表结构 13.2.2 设计SharePreference存储 13.3 项目实现流程 13.3.1 创建项目工程 13.3.2 项目各功能及界面实现 13.3.3 实现数据存取 13.3.4 实现Service 13.3.5 应用流程整体实现 13.3.6 后续开发完善 13.4 项目程序演示 13.5 项目程序签名、打包和发布 13.6 本章小结 第14章 Android综合案例三——基于Android的豆瓣网(Web2.0)移动客户端开发 14.1 关于豆瓣网和豆瓣网API 14.1.1 豆瓣网介绍 14.1.2 豆瓣网API介绍 14.1.3 豆瓣网API认证 14.1.4 豆瓣网API快速入门 14.1.5 豆瓣网APIJava库介绍 14.2 豆瓣网(Web2.0)客户端设计 14.2.1 客户端功能规划设计 14.2.2 UI和交互流程设计 14.2.3 数据存储设计 14.3 豆瓣网(Web2.0)客户端实现 14.3.1 申请APIKey 14.3.2 Activity实现 14.4 本章小结 第15章 Android综合案例四——在线音乐播放器 15.1 关于YOBO和YOBOAPI 15.1.1 YOBO简介 15.1.2 YOBO功能特点 15.1.3 YOBOAPI介绍 15.2 在线播放器架构设计 15.2.1 在线播放器功能规划设计 15.2.2 在线播放器UI设计 15.2.3 在线播放器数据存储设计 15.3 在线播放器的编程实现 15.3.1 申请APIKey 15.3.2 基础功能实现 15.3.3 实现Activity 15.3.4 实现Service 15.3.5 后续开发展望 15.4 在线音乐播放器应用演示 15.5 在线音乐播放器应用打包、签名和发布 15.6 本章小结 第16章 Android综合案例五——手机信息查看助手 16.1 手机信息查看助手功能规划和可行性分析 16.1.1 手机信息查看助手功能规划 16.1.2 手机信息查看助手可行性分析 16.2 手机信息查看助手功能实现 16.2.1 手机信息查看助手主界面 16.2.2 查看系统信息实现 16.2.3 查看硬件信息 16.2.4 查看软件信息 16.2.5 获取运行时信息 16.2.6 文件浏览器 16.2.7 项目的细节完善 16.3 手机信息查看助手功能展望 16.4 项目的打包、签名和发布 16.5 本章小结 第17章 芝麻开门——Android底层开发和移植概述 17.1 Android原始码下载 17.2 实机测试 17.2.1 NeoFreeRunner介绍 17.2.2 烧录androidfs.jffs2 17.3 Android移植技术概论 17.3.1 Android底层技术的重要性 17.3.2 Android移植项目介绍 17.3.3 Android的技术优点 ·收起全部<< 前言   随着3G的到来,无线带宽越来越高,使得更多内容丰富的应用程序布置在手机上成为可能,如视频通话、视频点播、移动互联网冲浪、在线看书/听歌、内容分享等。为了承载这些数据应用及快速部署,手机功能将会越来越智能,越来越开放,为了实现这些需求,必须有一个好的开发平台来支持,在此由Google公司发起的OHA联盟走在了业界的前列,2007年11月推出了开放的Android平台,任何公司及个人都可以免费获取到源代码及开发SDK。由于其开放性和优异性,Android平台得到了业界广泛的支持,其中包括各大手机厂商和著名的移动运营商等。继2008年9月第一款基于Android平台的手机G1发布之后,预计三星、摩托罗拉、索爱、LG、华为等公司都将推出自Gflg~Android平台的手机,中国移动也将联合各手机厂商共同推出基于Android平台的OPhone。按目前的发展态势,我们有理由相信,Android平台能够在短时间内跻身智能手机开发平台的前列。   由于Android平台被推出的时间才一年左右,了解Android平台软件开发技术的程序员还不多,如何迅速地推广和普及Android平台软件开发技术,让越来越多的人参与到Android应用的开发中,是整个产业链都在关注的一个话题。本书作者较早就从事Android的研究与开发工作,为了帮助开发者更快地进入Android开发行列,他们不辞辛劳地编写了Android开发教程-《Google Android开发入门与实战》。本书系统讲解了Android软件开发的基础知识,图文并茂地帮助读者学习和掌握SDK、开发流程以及常用的API等。书中以讲述实战实例为导向,用一个个典型应用生动地引领读者进行项目开发实践。作为一本既及时、又翔实、理论实践相结合的教程,《Google Android开发入门与实战》一书很值得入门者阅读。   值得一提的是,书中的开发实例很有创意,将传统互联网的内容/服务与移动平台紧密结合起来,如书中的豆瓣网客户端、在线音乐播放器等应用,都体现了移动互联网应用所需的创新精神及良好的用户体验理念,这个设计思路很值得大家去思考和学习。   最后,祝广大开发者的技术日益精进,早日开始Android开发之旅,赶上移动互联网的第一班车,共赢中国3G未来!
Google Android开发入门与实战的代码 1章 掀起你的盖头来——初识Android. 1 1.1 认识Android 1 1.2 Android的背景 2 1.2.1 Android的历史 2 1.2.2 Android的发展 2 1.3 我的Android我做主 2 1.3.1 开发基于Android平台的应用 3 1.3.2 参加Android开发者大赛 3 1.3.3 个人英雄主义再现——得到更多人的认可和尊重 3 1.3.4 获得应有的收益——Android Market 3 1.4 真实体验——Android模拟器 4 1.4.1 模拟器概述 4 1.4.2 模拟器和真机的区别 4 1.4.3 模拟器使用注意事项 4 1.5 更上一层楼——加入Android开发社区 5 1.6 本章小结 6 第2章 工欲善其事 必先利其器——搭建Android开发环境 7 2.1 开发Android应用前的准备 7 2.1.1 Android开发系统要求 7 2.1.2 Android软件开发包 7 .2.1.3 其他注意事项 8 2.2 Windows开发环境搭建 8 2.2.1 JDK、Eclipse、Android SDK软件安装 8 2.2.2 SDK的家在哪里——设定Android SDK Home 14 2.2.3 真的准备好了吗——开发环境验证 14 2.2.4 创建Android 虚拟设备(AVD) 15 2.3 Linux一族——Ubuntu开发环境搭建 17 2.3.1 Java、Eclipse和ADT插件安装 17 2.3.2 设定Android SDK Home 23 2.4 Mac OS一族——苹果开发环境搭建 24 2.5 本章小结 24 第3章 清点可用资本——Android SDK介绍 25 3.1 Android SDK 基础 25 3.2 深入探寻Android SDK的密码 25 3.2.1 Android SDK目录结构 25 3.2.2 android.jar及内部结构 27 3.2.3 SDK文档及阅读技巧 27 3.2.4 先来热热身——Android SDK例子解析 28 3.2.5 SDK提供的工具介绍 31 3.3 Android典型包分析 33 3.3.1 开发的基石——Android API核心开发包介绍 33 3.3.2 拓展开发外延——Android可选API介绍 34 3.4 本章小结 34 第4章 赚钱的市场——Android Market及应用发布 35 4.1 Google Market产生背景与目的 35 4.2 体验“选货”的乐趣——在G1上体验Market的使用 35 4.3 Android开发活动及特色应用 37 4.3.1 开发应用的领域 37 4.3.2 Android Market特色应用一览 38 4.4 你也可以做东家——申请Market账号 43 4.4.1 卖东西要先入伙——准备工作 43 4.4.2 入伙过程——申请 44 4.5 开张了——在Market上发布应用 45 4.5.1 发布时可能遇到的错误 45 4.5.2 卖东西也要签名——生成签名文件 46 4.5.3 打包、签名、发布应用 48 4.6 本章小结 51 第5章 千里之行 始于足下——第一个应用HelloWorld 52 5.1 HelloWorld应用分析 52 5.1.1 新建一个Android工程 52 5.1.2 填写工程的信息 52 5.1.3 编程实现 53 5.1.4 运行项目 54 5.2 调试项目 54 5.2.1 设置断点 54 5.2.2 Debug 项目 55 5.2.3 断点调试 55 5.3 本章小结 56 第6章 磨刀不误砍柴工——Android应用程序结构介绍 57 6.1 Android体系结构介绍 57 6.1.1 应用程序(Application) 57 6.1.2 应用程序框架(Application Framework) 58 6.1.3 库(Libraries)和运行环境(RunTime) 58 6.2 Android 应用程序组成 59 6.2.1 Activity介绍 59 6.2.2 Broadcast Intent Receiver介绍 60 6.2.3 Service介绍 61 6.2.4 Content Provider介绍 61 6.3 Android应用工程文件组成 61 6.4 本章小结 62 第7章 良好的学习开端——Android基本组件介绍 63 7.1 第一印象很重要——界面UI元素介绍 63 7.1.1 视图组件(View) 63 7.1.2 视图容器组件(Viewgroup) 63 7.1.3 布局组件(Layout) 64 7.1.4 布局参数(LayoutParams) 64 7.2 我的美丽我做主——Android中应用界面布局 64 7.2.1 实例操作演示 65 7.2.2 实例编程实现 66 7.3 不积跬步 无以至千里——常用widget组件介绍 75 7.3.1 创建widget组件实例 75 7.3.2 按钮(Button)介绍与应用 76 7.3.3 文本框(TextView)介绍与应用 77 7.3.4 编辑框(EditText)介绍与应用 79 7.3.5 多项选择(CheckBox)介绍与应用 81 7.3.6 单项选择(RadioGroup )介绍与应用 83 7.3.7 下拉列表(Spinner )介绍与应用 85 7.3.8 自动完成文本(AutoCompleteTextView ) 87 7.3.9 日期选择器(DatePicker)介绍与应用 89 7.3.10 时间选择器(TimePicker)介绍与应用 90 7.3.11 滚动视图(ScrollView)介绍与应用 91 7.3.12 进度条(ProgressBar)介绍与应用 92 7.3.13 拖动条(SeekBar)介绍与应用 93 7.3.14 评分组件(RatingBar)介绍与应用 94 7.3.15 图片视图(ImageView)介绍与应用 95 7.3.16 图片按钮(ImageButton)介绍与应用 96 7.3.17 切换图片(ImageSwitcher&Gallery) 96 7.3.18 网格视图(GridView)介绍与应用 99 7.3.19 标签(Tab)介绍与应用 101 7.4 友好的菜单——menu介绍与实例 102 7.4.1 实例操作演示.. 103 7.4.2 实例编程实现 103 7.5 Android应用的灵魂——Intent和Activity介绍与实例 106 7.5.1 实例操作演示 106 7.5.2 实例编程实现 106 7.6 用好列表,做好程序——列表(ListView)介绍与实例 111 7.6.1 实例程序演示 111 7.6.2 实例编程实现 112 7.7 友好地互动交流——对话框(Dialog)介绍与实例 119 7.8 温馨的提醒——Toast和Notification应用 127 7.8.1 实例操作演示 128 7.8.2 实例编程实现 129 7.9 本章小结 135 第8章 移动信息仓库——Android的数据存储操作 136 8.1 Android数据存储概述 136 8.2 轻轻地我保护——SharedPreferences存储 136 8.3 谁的文件,谁主宰——文件存储 140 8.4 打造自己的数据库存储——SQLite存储方式 141 8.4.1 Android中对数据库操作 141 8.4.2 完整地操作数据库——日记本实例 147 8.5 我的数据你来用——ContentProvider介绍 155 8.5.1 初识ContentProvider 155 8.5.2 使用ContentProvider读取系统数据 156 8.5.3 使用ContentProvider操作数据日记本实例 159 8.6 再学一招——网络存储 171 8.7 本章小结 173 第9章 我来“广播”你的“意图”——Intent和Broadcast面对面 174 9.1 Android应用程序的核心——Intent 174 9.1.1 Intent基础 174 9.1.2 用Intent启动一个新的Activity 174 9.1.3 Intent 详细讲解 177 9.1.4 Android解析Intent实现 179 9.2 用广播告诉你——利用Intent来广播(BroadCast)事件 180 9.2.1 实现Android中的广播事件 180 9.2.2 BroadCast Receiver介绍 181 9.3 应用实例详解 181 9.3.1 程序操作演示 182 9.3.2 实例编程实现 182 9.4 本章小结 186 第10章 一切为用户服务——Service应用实例 187 10.1 认识Service 187 10.2 使用Service 188 10.3 Service的生命周期 194 10.4 实例学习Service 194 10.4.1 精彩实例一——定时提醒 194 10.4.2 精彩实例二——音乐播放器 198 10.5 本章小结 201 第11章 循序渐进——开发Android应用的基本步骤 202 11.1 兵马未动 粮草先行——应用规划及架构设计 202 11.2 应用开发步骤 202 11.2.1 界面设计始终是第一位——实现UI 203 11.2.2 必备的动力源泉——数据操作和存储 203 11.2.3 华丽转身——实现多页面跳转 203 11.2.4 始终为用户做好服务——增加Service 203 11.2.5 细节决定成败——完善应用细节 203 11.3 成功就在眼前——应用测试和发布 204 11.3.1 只欠东风——应用测试 204 11.3.2 可以赚钱了——发布到Android Market 204 11.4 本章小结 204 第12章 Android综合案例一——RSS阅读器实例 205 12.1 RSS介绍 205 12.1.1 RSS基础 205 12.1.2 RSS的历史 205 12.1.3 RSS语法介绍 206 12.2 SAX介绍 207 12.2.1 SAX基础 207 12.2.2 使用SAX的作用 207 12.2.3 怎样使用SAX 207 12.3 RSS阅读器设计 209 12.3.1 RSS阅读器功能设计 209 12.3.2 RSS阅读器UI和交互流程设计 209 12.4 RSS阅读器的实现 210 12.4.1 程序实体解析 210 12.4.2 实现一个自己的ContentHandler 214 12.4.3 Activity的实现 217 12.5 本章小结 220 第13章 Android综合案例二——基于Google Map开发个人移动地图 221 13.1 项目UI规划 221 13.2 数据存储实现 222 13.2.1 设计数据库及表结构 222 13.2.2 设计SharePreference 存储 223 13.3 项目实现流程 223 13.3.1 创建项目工程 223 13.3.2 项目各功能及界面实现 224 13.3.3 实现数据存取 247 13.3.4 实现Service 252 13.3.5 应用流程整体实现 254 13.3.6 后续开发完善 255 13.4 项目程序演示 255 13.5 项目程序签名、打包和发布 257 13.6 本章小结 259 第14章 Android综合案例三——基于Android的豆瓣网(Web 2.0)移动客户端开发 260 14.1 关于豆瓣网和豆瓣网API 260 14.1.1 豆瓣网介绍 260 14.1.2 豆瓣网API介绍 261 14.1.3 豆瓣网API认证 261 14.1.4 豆瓣网API快速入门 264 14.1.5 豆瓣网API Java库介绍 265 14.2 豆瓣网(Web 2.0)客户端设计 268 14.2.1 客户端功能规划设计 268 14.2.2 UI和交互流程设计 268 14.2.3 数据存储设计 270 14.3 豆瓣网(Web 2.0)客户端实现 270 14.3.1 申请API Key 270 14.3.2 Activity实现 271 14.4 本章小结 282 第15章 Android综合案例四——在线音乐播放器 283 15.1 关于YOBO和YOBO API 283 15.1.1 YOBO简介 284 15.1.2 YOBO功能特点 284 15.1.3 YOBO API介绍 284 15.2 在线播放器架构设计 285 15.2.1 在线播放器功能规划设计 285 15.2.2 在线播放器UI设计 285 15.2.3 在线播放器数据存储设计 286 15.3 在线播放器的编程实现 286 15.3.1 申请API Key 286 15.3.2 基础功能实现 287 15.3.3 实现Activity 290 15.3.4 实现Service 306 15.3.5 后续开发展望 310 15.4 在线音乐播放器应用演示 310 15.5 在线音乐播放器应用打包、签名和发布 311 15.6 本章小结 311 第16章 Android综合案例五——手机信息查看助手 312 16.1 手机信息查看助手功能规划和可行性分析 312 16.1.1 手机信息查看助手功能规划 312 16.1.2 手机信息查看助手可行性分析 312 16.2 手机信息查看助手功能实现 313 16.2.1 手机信息查看助手主界面 313 16.2.2 查看系统信息实现 316 16.2.3 查看硬件信息 320 16.2.4 查看软件信息 324 16.2.5 获取运行时信息 326 16.2.6 文件浏览器 328 16.2.7 项目的细节完善 331 16.3 手机信息查看助手功能展望 332 16.4 项目的打包、签名和发布 332 16.5 本章小结 333 第17章 芝麻开门——Android底层开发和移植概述 334 17.1 Android原始码下载 334 17.2 实机测试 335 17.2.1 Neo FreeRunner 介绍 335 17.2.2 烧录androidfs.jffs2 336 17.3 Android移植技术概论 337 17.3.1 Android底层技术的重要性 337 17.3.2 Android移植项目介绍 338 17.3.3 Android的技术优点... 340
Google Android 开发入门与实战 PDF》 是一本介绍和实践Android开发的电子书籍。Android是一种流行的移动操作系统,它具有广泛的用户基础和强大的开发生态系统,为开发人员提供了丰富的工具和资源。 这本电子书的目的是帮助初学者了解Android开发的基本概念和技术,并通过实战项目来加深对这些知识的理解和应用。该书内容包括以下几个方面: 1. Android开发环境的搭建:介绍如何配置Android开发工具包(Android SDK)、集成开发环境(如Android Studio)和模拟器。 2. Android应用的基本结构:讲解Android应用的基本组成部分,如Activity、布局、资源等,以及它们之间的交互原理。 3. 用户界面设计:介绍Android应用中常用的UI组件和布局方式,以及如何使用它们创建一个吸引人的用户界面。 4. 数据存储和管理:讲解如何使用SQLite数据库来存储和管理应用程序的数据。 5. 网络通信:介绍如何使用Android提供的API来实现网络通信,包括HTTP请求和响应的处理。 6. 多媒体处理:介绍如何在Android应用中处理图像、音频和视频等多媒体资源。 除了以上内容,该电子书还包括了许多例子和实验,通过动手实践来巩固所学知识。通过实例项目的实践,读者可以更好地理解和掌握Android开发的技能。 总之,《Google Android 开发入门与实战 PDF》 是一本适合初学者的Android开发教程,通过理论与实践相结合的方式,帮助读者快速入门并掌握Android开发的基本技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值