精华内容
下载资源
问答
  • 使用Android实现联网

    2021-02-27 05:32:52
    也许您希望告诉全世界您正在使用Twitter。或者希望收到有关在本地洗衣店或熟食店的排号。如果希望将Android连接到您所生活的世界,那么请阅读本文。简介本文建立在“使用Eclipse开发Android应用程序”一文的基础之上...
  • 适用于Android的类似于GuitarPro的应用,可与的实际吉他配合使用 从录音中了解和弦和音符是一项艰巨的任务。 但是,只抓住吉他并弹奏而不将其连接到任何可以解析振动并正确理解所有内容的特殊设备上,确实很吸引人...
  • transformer-libs/transformer-plugin是一个Gradle插件,使用Android Gradle Transform API来执行字节码操作。 transformer-libs/transformer-module是一个Android库项目。 tranformer-app是一个Android应用程序...
  • Productivity_App_1.2a 你好,世界!这是Daniel Iles和David ...我们正在使用Android Studio(主要是Java)来创建我们的应用。我们正在使用的SDK是(版本30.0.2)。如果对我们如何改进代码有任何建议,请告诉我们!
  • 使用JAVA构建的Android应用可跟踪的运动活动。 使用Firebase进行登录和用户数据。 这个程序仍在建设中。 计划在2018年10月卷土重来。 屏幕截图 使用 -Firebase登录 -Google Maps API 执照 此项目已获得MIT许可证...
  • 使用 Android 实现联网

    2010-03-16 10:35:00
    也许您希望告诉全世界您正在使用 Twitter。或者希望收到有关在本地洗衣店或熟食店的排号。如果希望将 Android 连接到您所生活的世界,那么请阅读本文。 简介本文建立在 “使用 Eclipse 开发 Android
    Android 是面向应用程序开发的丰富平台,它提供一套出色的用户界面元素和数据管理功能。它还为开发连接到真实世界的应用程序提供了出色的网络选项。您希望连接到哪里?也许您希望告诉全世界您正在使用 Twitter。或者希望收到有关在本地洗衣店或熟食店的排号。如果希望将 Android 连接到您所生活的世界,那么请阅读本文。

    简介

    本文建立在 “使用 Eclipse 开发 Android 应用程序” 一文的基础之上,探究了 Android 的网络功能。了解如何利用 Android 的网络选项来实现有趣、有用的东西。Android 平台非常适合 Java™ 开发人员:他们可以使用已有的技能将网络连接带到一个移动或 “嵌入式” 平台中。

    在本文中,了解用于 Android 应用程序的网络选项以及基本的 Android 联网技巧。本文研究一个真实的应用程序,它在结合使用环境监视系统时需要具备联网功能。这类系统为什么如此重要?原因之一是:如果您的朋友需要外出几个星期,在他离开后,他打电话给我,让我从他家里找到某样东西并邮寄给他。我来到他的家里,发现供暖设备已经被切断并且水管已经冻裂 — 场面非常混乱。如果备有一个温度监控系统,那么就可以避免出现这类事故。本文将探查 Android 在这类监控系统中扮演的角色。

     




    回页首


    Android 联网功能

    Android 基于 Linux® 内核,包含一组优秀的联网功能。如果尚未安装 Android SDK,那么需要 下载 它才能实践本文的示例。

    表 1 展示了 Android SDK 中一些与网络有关的包。


    表 1. Android SDK 网络包

    描述
    java.net 提供与联网有关的类,包括流和数据包(datagram)sockets、Internet 协议和常见 HTTP 处理。该包是一个多功能网络资源。有经验的 Java 开发人员可以立即使用这个熟悉的包创建应用程序。
    java.io 虽然没有提供显式的联网功能,但是仍然非常重要。该包中的类由其他 Java 包中提供的 socket 和连接使用。它们还用于与本地文件(在与网络进行交互时会经常出现)的交互。
    java.nio 包含表示特定数据类型的缓冲区的类。适合用于两个基于 Java 语言的端点之间的通信。
    org.apache.* 表示许多为 HTTP 通信提供精确控制和功能的包。可以将 Apache 视为流行的开源 Web 服务器。
    android.net 除核心 java.net.* 类以外,包含额外的网络访问 socket。该包包括 URI 类,后者频繁用于 Android 应用程序开发,而不仅仅是传统的联网方面。
    android.net.http 包含处理 SSL 证书的类。
    android.net.wifi 包含在 Android 平台上管理有关 WiFi(802.11 无线 Ethernet)所有方面的类。并不是所有设备都配备了 WiFi 功能,特别是 Android 在 Motorola 和 LG 等手机制造商的 “翻盖手机” 领域获得了成功。
    android.telephony.gsm 包含用于管理和发送 SMS(文本)消息的类。一段时间后,可能会引入额外的包来来为非 GSM 网络提供类似的功能,比如 CDMA 或 android.telephony.cdma 等网络。

     

    上表并没有列出所有包,但是可以让您清楚地意识到该平台的强大功能。下一小节将介绍一些简单的网络示例。

     




    回页首


    简单的网络示例

    为了演示将 Android 连接到一个网络有多么简单,这个示例将展示如何从 Web 页面发送文本。可以 下载 本例的源代码。图 1 展示了应用程序的实际使用。


    图 1. 从 Web 页面获取文本
    从 Web 页面获取文本

    本节提供了构建示例应用程序所需的代码。我们将首先查看 UI 部分,然后介绍与网络有关的代码。

    共有三个 UI 元素:

    • EditText 让用户能够进入一个 Web 页面(图 1 和 清单 2 所示的 http://developer.android.com)。
    • 使用一个按钮告诉程序取回 Web 页面文本。
    • 检索回数据后,它将显示在 TextView 中。

     

    清单 1 展示了 main.xml 文件,这是该应用程序的完整 UI 布局。


    清单 1. main.xml

    				
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <EditText 
    android:layout_height="wrap_content"
    android:id="@+id/address"
    android:layout_width="fill_parent"
    android:text="http://google.com"
    >
    </EditText>
    <Button
     android:id="@+id/ButtonGo" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"
     android:text="go!"
     >
    </Button>
    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:background="#ffffff"
        android:textColor="#000000"
    	android:id="@+id/pagetext"
        />
    </LinearLayout>
    

     

    清单 2 展示了本示例使用的 Java 代码。


    清单 2. GetWebPage.java

    				
    package com.msi.getwebpage;
    
    import android.app.Activity;
    import android.os.Bundle;
    // used for interacting with user interface
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.EditText;
    import android.view.View;
    // used for passing data 
    import android.os.Handler;
    import android.os.Message;
    // used for connectivity
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.URL;
    import java.net.URLConnection;
    
    
    public class GetWebPage extends Activity {
        /** Called when the activity is first created. */
    
        Handler h;
    	
    	@Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            final EditText eText = (EditText) findViewById(R.id.address);
            final TextView tView = (TextView) findViewById(R.id.pagetext);
            
            this.h = new Handler() {
    
                @Override
                public void handleMessage(Message msg) {
                    // process incoming messages here
                    switch (msg.what) {
                        case 0:
                        	tView.append((String) msg.obj);
                        	break;
                    }
                    super.handleMessage(msg);
                }
            };
            final Button button = (Button) findViewById(R.id.ButtonGo);
            button.setOnClickListener(new Button.OnClickListener() {
                public void onClick(View v) {
                	try	{
                		tView.setText("");
                    // Perform action on click
                    	URL url = new URL(eText.getText().toString());
                        URLConnection conn = url.openConnection();
                        // Get the response
                        BufferedReader rd = new BufferedReader(new 
    InputStreamReader(conn.getInputStream()));
                        String line = "";
                        while ((line = rd.readLine()) != null) {
                    		Message lmsg;
                            lmsg = new Message();
                            lmsg.obj = line;
                            lmsg.what = 0;
                            GetWebPage.this.h.sendMessage(lmsg);
                        }
                	}
                	catch (Exception e)	{
                	}
                }
            });        
        }
    }
    

     

    这些代码可以分解成一些常见的部分。这里使用一些重要(必需)的导入语句来恰当地引用 UI、数据传递以及应用程序中使用的与网络有关的类。所有与网络相关的代码出现在 OnClickListenerOnClick 方法中。在选择 图 1 所示的标签为 go! 的按钮之后调用这些代码。

    URLURLConnection 类共同提供与用户所选的 Web 站点的连接。BufferedReader 的一个实例负责从 Web 站点连接中读取传入的数据。每读取一行代码,文本就被附加到一个 TextView。数据并没有直接指定给 TextView(但是在本例中可以)。我们引入了一种设计模式,即创建一个消息对象并将该对象发送到一个处理程序的实例。这是更新 UI 的一种比较可取的方法,对可能需要同时运行多个线程的应用程序而言尤其如此。

    在示例中,Android 应用程序与 HTTP Web 服务器进行通信,比如 Apache 或 Internet Information Server(IIS 位于 Microsoft® 服务器上)。如果应用程序直接与 TCP socket 对话,那么您将以不同的方式实现应用程序。清单 3 所示的代码片段展示了另一种与远程服务器交互的方式。这个清单被实现为一个单独的线程。


    清单 3. Daytime 客户机

    				
        public class Requester extends Thread {
            Socket requestSocket;
            String message;
            StringBuilder returnStringBuffer = new StringBuilder();
            Message lmsg;
            int ch;
            @Override
            public void run() {
                try {
                    this.requestSocket = new Socket("remote.servername.com", 13);
                    InputStreamReader isr = new InputStreamReader(this.requestSocket.
    getInputStream(), "ISO-8859-1");
                    while ((this.ch = isr.read()) != -1) {
                        this.returnStringBuffer.append((char) this.ch);
                    }
                    this.message = this.returnStringBuffer.toString();
                    this.lmsg = new Message();
                    this.lmsg.obj = this.message;
                    this.lmsg.what = 0;
                    h.sendMessage(this.lmsg);
                    this.requestSocket.close();
                } catch (Exception ee) {
                    Log.d("sample application", "failed to read data" + ee.getMessage());
                }
            }
        }
    

     

    与前面的示例类似,上面的代码使用消息和处理程序方法来将数据发送给调用者,调用者将更新 UI 并执行后续处理。与 清单 1 不同,这个例子并没有与 HTTP 服务器通信,因此没有使用 URLConnection 类。相反,使用了较低级的 Socket 类在端口 13 打开与远程服务器的基于流的 socket 连接。端口 13 是典型的 “Daytime Server” 应用程序。

    Daytime Server 接受传入的 socket 连接并以文本的形式将日期和时间发送给调用 socket。一旦发送完数据,服务器将关闭 socket。示例也展示了 InputStreamReader 的使用和一个特定字符编码。

    发送文本消息是您需要使用 Android 完成的另一项任务。清单 4 展示了一个示例。


    清单 4. 发送一条文本消息

    				
    void sendMessage(String recipient,String myMessage) {
     SmsManager sm = SmsManager.getDefault();
     sm.sendTextMessage("destination number",null,"hello there",null,null);
    }
    

     

    发送文本消息非常简单。首先,使用静态方法 getDefault() 获取对 SmsManager 的引用。然后调用 sendTextMessage 方法。参数为:

    接收者的手机号
    包括区号。
    服务中心电话号码
    使用 null 值表示您同意使用默认服务中心来处理消息。除了非常特殊的应用程序外,几乎所有应用程序都对这个参数使用 null 值。
    消息的实际内容
    将消息长度保持在 160 字节以内,除非您可以接受将数据分为多个消息发送。
    未收到消息 intent
    如果消息被发送或出现了错误,那么将开始一个可选的 intent。如果不需要这类通知,那么可以为此参数传递一个 null 值。(参见 参考资料 了解有关 intent 和 Android 基本原理的更多信息)。
    收到消息 intent
    当收到发送确认后,将开始一个可选的 Intent。如果发送通知不重要的话,那么可以为这个参数传递一个 null 值。

    不管是连接到 Web 页面还是连接到定制 TCP 应用程序,Android 平台都可以立即反应并且能够提供帮助。如 清单 4 所示,发送文本消息非常简单。通过使用可选的 intent 参数,甚至可以在消息被发送并交付后采取操作。这是其他移动平台所不具备的强大特性。

    下一节将快速浏览一个真实的应用程序设计。

     




    回页首


    环境监控系统

    在这个场景中,我们假设您是企业所在的若干办公场所的资产管理员。管理资产与管理数据中心没有太大的差别 — 一般情况下都很枯燥,只有出现紧急的情况下工作才会比较有意思。几天前,一台使用了 10 年的热水器突然漏水,渗到一个装满老式 PC 和培训手册的存储柜,您必须检查一下清理情况。幸运的是,您当时没有外出。如果您在旅途中的话,那么情形将非常糟糕。此类灾难性事故促使我们考虑使用 Android 来帮助监视资产的维护情况。图 2 展示了此类系统的一个高级方框图。


    图 2. 监控系统的高级方框图
    监控系统的高级方框图

    此架构是一种比较传统的方法,使用一个微控制器与一些简单场景进行交互以收集数据。数据随后通过一个串行通信协议(比如 RS232 或 RS485)发送到控制器。控制器可以是一个 PC 或类似的机器。随后可以穿过防火墙通过 Internet 访问数据。Android 电话(比如 TMobile G1)之间使用的协议可以是 HTTP 或私有协定。

    在控制器和配备 Android 的设备之间发送的数据将是表示以下内容的基本数据:

    • 出现漏水
    • 当前温度
    • 消耗的功率
    • 可能包含一些通用的类似数据和数字值

     

    为什么需要关注消耗的功率?一个可能的原因就是有些人忘记关闭机器,因此电费单上的数字会一直增长。第二个理由有些复杂:假设您有一台非常大的冰箱,并且电源可能已被关闭。那么情况就复杂了,而且处理起来也需要很高的代价。或者,空调设备的断路器出现故障,因此机房无法保持恒定的温度。

    基本的设计看上去是可行的。如果使用的是 Android,那么可以使用任何移动平台来替换 图 2 中的 Android。但如果使用配备了 Android 的设备替换微控制器,那应该怎么做呢?下一节将讨论对这个应用程序的扩展以及通过使用 Android 而启用的特性。

     




    回页首


    扩展应用程序

    本文的第一个架构以一个微控制器为中心。微控制器可分为不同的外形和大小,从 Microchip 的 6 pin “10F” 到添加了外围设备、pin 和代码空间的 32 位大型微控制器。如果使用 Android 取代传统的微控制器放到设备中,会怎么样?对于某些应用程序而言,在成本方面是不可取的,但是根据图 3 的判断,这种方法也是可行的。


    图 3. 在设备中使用 Android 的可能架构
    在设备中使用 Android 的可能架构

    使用嵌入式的方式部署 Android 为您提供了更加丰富的编程环境。您可以和以前一样继续监视湿度、温度和功率消耗特征,同时还可以观察到记录音频、视频和振动。您将拥有一个微报警、访问控制系统,以及一个环节监控工具。由于 Android 已经可以实现联网,您不需要使用控制器 PC 就可以实现监控并与网络直接对话。

    这种方法还为现场更新软件提供了额外的好处。假设您希望为监控软件添加新的特性(或修复 bug)。如果使用传统的微控制器方法,那么任务执行起来将十分繁琐并且代价昂贵,甚至根本不可能实现。而对于 Android 而言,您可以获得更整洁的部署模型并拥有更好的灵活性。

    Android 如今主要运行在移动手机中,但是它已经被移植到 NetBooks 和其他平台上。希望本文为您提供了一些好的思考内容。我现在该去运行我的系统了。您永远也不会知道下一次热水器漏水会在什么时候发生。

     




    回页首


    结束语

    在本文中,我们大体介绍了 Android 的联网功能。您了解了一些自己可以创建的样例应用程序,包括与 Web 服务器交互和发送文本消息。您看到了如何将 Android 连接到一个真实的环境监控系统。通过代码示例,您了解到应该在什么时候将 Android 扩展到一些特殊应用程序中,比如嵌入式控制器。

    请继续关注我的下一篇文章,它将介绍如何使用基于 Android 的电话构建一个婴儿监控系统。



    展开全文
  • 披风 如果想参加这个有趣的活动,请随时与联系,我们一直在寻找更多的开发者。... Cloak仍处于开发的早期阶段,尽管某些功能目前正在运行,但我们不建议依靠Cloak作为唯一的安全性。 开发人员: Ross Epstein
  • Grooido库旨在将Android布局XML(太冗长)中解放出来,将能够创建Android布局,例如 @Override @CompileDynamic void onCreate ( Bundle savedInstanceState ) { super . onCreate(savedInstanceState) ...
  • 您正在使用哪个Android设备和Android系统版本? 您使用的是哪个Android Studio版本? 对问题的简短描述包括调试日志或屏幕截图。 您遇到的任何错误或错别字。 执照 Android-ImportAndActivateSDKInAndroi
  • 使用Android Studio(或其他IDE),打开保存在所选目录中的项目。 单击运行(Shift + F10)按钮运行项目。 部署方式 另一个项目将是发布该项目中使用的服务的服务器。 测验 可以在上下载APK文件,在Android上...
  • 协程是一种并发设计模式,可以在 Android 平台上使用它来简化异步执行的代码,协程是我们在 Android 上进行异步编程的推荐解决方案 轻量:可以在单个线程上运行多个协程,因为协程支持挂起,不会使正在运行协程...

    Android 使用 Kotlin 协程例子

    协程是一种并发设计模式,您可以在 Android 平台上使用它来简化异步执行的代码,协程是我们在 Android 上进行异步编程的推荐解决方案

    1. 轻量:您可以在单个线程上运行多个协程,因为协程支持挂起,不会使正在运行协程的线程阻塞。挂起比阻塞节省内存,且支持多个并行操作
    2. 内存泄露更少:使用结构化并发机制在一个作用域内执行多个操作。
    3. 内置取消支持:取消功能会自动通过正在运行的协程层次结构传播
      4.Jetpack 集成:许多 Jetpack 库都包含提供全面协程支持的扩展。某些库还提供自己的协程作用域,可供您用于结构化并发

    实例

    class LoginViewModel(
        private val loginRepository: LoginRepository
    ): ViewModel() {
    
        fun login(username: String, token: String) {
            // Create a new coroutine to move the execution off the UI thread
            viewModelScope.launch(Dispatchers.IO) {
                val jsonBody = "{ username: \"$username\", token: \"$token\"}"
                loginRepository.makeLoginRequest(jsonBody)
            }
        }
    }
    

    下面我们仔细分析一下 login 函数中的协程代码:

    1. viewModelScope 是预定义的 CoroutineScope,包含在 ViewModel KTX 扩展中。请注意,所有协程都必须在一个作用域内运行。一个 CoroutineScope 管理一个或多个相关的协程。
    2. launch 是一个函数,用于创建协程并将其函数主体的执行分派给相应的调度程序。
    3. Dispatchers.IO 指示此协程应在为 I/O 操作预留的线程上执行。

    上面三个类就是协程中最重要的内容: coroutineScope; launch() 方法, Dispatchers

    使用协程确保主线程安全

    如果函数不会在主线程上阻止界面更新,我们即将其视为是主线程安全的。makeLoginRequest 函数不是主线程安全的,因为从主线程调用 makeLoginRequest 确实会阻塞界面。可以使用协程库中的 withContext() 函数将协程的执行操作移至其他线程:

    class LoginRepository(...) {
        ...
        suspend fun makeLoginRequest(
            jsonBody: String
        ): Result<LoginResponse> {
    
            // Move the execution of the coroutine to the I/O dispatcher
            return withContext(Dispatchers.IO) {
                // Blocking network request code
            }
        }
    }
    
    class LoginViewModel(
        private val loginRepository: LoginRepository
    ): ViewModel() {
    
        fun login(username: String, token: String) {
    
            // Create a new coroutine on the UI thread
            viewModelScope.launch {
                val jsonBody = "{ username: \"$username\", token: \"$token\"}"
    
                // Make the network call and suspend execution until it finishes
                val result = loginRepository.makeLoginRequest(jsonBody)
    
                // Display result of the network request to the user
                when (result) {
                    is Result.Success<LoginResponse> -> // Happy path
                    else -> // Show error in UI
                }
            }
        }
    }
    

    示例中,协程是在 LoginViewModel 中创建的。由于 makeLoginRequest 将执行操作移出主线程,login 函数中的协程现在可以在主线程中执行:

    参考:

    1. Android 与协程
    2. kotlin协程
    3. 将 Kotlin 协程与架构组件一起使用
    展开全文
  • 该库是使用androidX构建的,因此应该迁移到androidX中才能毫无问题地使用该库。 对于迁移,可以使用 正在安装 步骤1.将JitPack存储库添加到的构建文件中,将其添加到存储库末尾的root build.gradle中: ...
  • 作者:Chad Brubaker -?Android 安全部门高级软件工程师? Android 一直致力于保护其...如同在 Android P 预览版中宣布的一样,我们正在通过阻止目标为 Android P 的应用在默认情况下允许未加密的连接这一行为来...

    作者:Chad Brubaker -?Android 安全部门高级软件工程师?

     

    Android 一直致力于保护其用户、用户的设备以及用户数据的安全。其中一种保持数据安全的方式是让所有进入或离开 Android 设备的数据通过安全传输层 (TLS) 来通信。如同在 Android P 预览版中宣布的一样,我们正在通过阻止目标为 Android P 的应用在默认情况下允许未加密的连接这一行为来进一步改进这些保护措施。

     

    伴随着多年来为了更好地保护 Android 用户所做出的改变。为了防止意外的非加密连接,我们在 Android Marshmallow 中引入了新的 manifest 属性?android:usesCleartextTraffic。在 Android Nougat 中,通过创建?Network Security Config?来扩展了这个属性,用来表明 app 并没有使用加密网络链接的倾向。在 Android Nougat 和 Oreo 中, 我们仍然允许明文传播。

     

     

    如何更新您的 app?

    如果您 app 的所有网络请求已经使用上了 TLS,那么您什么都不用做。但如果不是,则需要使用 TLS 来加密所有的网络请求。如果您仍然需要发起明文传输的请求,请继续阅读下文。

     

    为什么需要使用 TLS?

    Android 系统认为所有网络都可能是具有敌意的,因此应始终使用加密流量。移动设备则是更加容易受到攻击,因为它们经常性地链接到许多不同的网络,比如咖啡店的 Wi-Fi。

     

    所有的网络传输都应该被加密,无论它们传输的何种内容,因为任何未加密的连接都可能被攻击并被注入额外内容,让潜在拥有脆弱防护性能的客户端代码更能够被多点击破,或是用来跟踪用户。

     

    TLS 会很慢吗?

    当然不是!

     

    如何在 app 中使用 TLS?

    一旦您的服务器端支持了 TLS,只要简单地将 app 和服务器响应的 URL 从 http:// 改变成 https://。您的 HTTP 堆栈将会自动地处理好相关事宜。

     

    如果您需要自己处理套接字,请使用 [SSLSocketFactory] 而不是 [SocketFactory]。请一定要特别注意正确地使用套接字,因为 [SSLSocket] 没有提供主机名的验证。您的 app 需要自己来处理主机名验证,最好通过调用?[getDefaultHostnameVerifier()] 来处理主机名。而是,当调用?HostnameVerifier.verify()?时一定要谨慎,它没有抛出任何异常或者错误,相反它返回了一个需要明确检查值的布尔值结果。

     

    我还是需要使用明文传输

    当然您应该在所有链接中使用 TLS,但有可能由于历史原因您还是需要使用明文传输,比如连接上一台无人维护的老旧服务器。要这样做,就需要配置 app 的网络安全设置来允许这些连接。

     

    我们已经有了一些这样的范例配置。请查看?network security config?来获得更多的帮助。

     

    >>?network security config

    https://developer.android.google.cn/training/articles/security-config

     

    允许特殊的域名使用明文传输

    如果您需要允许连接到特定域名或一组域名,可以使用以下配置作为指导:

    640?wx_fmt=jpeg

     

    允许连接到任意不安全的域名

    如果您的应用支持通过不安全连接从 URL 打开任意内容,您只需设置与自己的服务器通信时才使用加密传输。时刻记住,小心处理从非安全连接得到的数据,它们可能已经在传输过程中被篡改。

    640?wx_fmt=jpeg

     

     

    如何更新库?

    如果您使用的库直接地创建了安全或者非安全的连接,什么是预科确保它们在发起任意明文传输请求前调用过?isCleartextTrafficPermitted 来检查其行为可行性。

     

     

    ?点击屏末?|?阅读原文?|?您可查看?Android?和?Google Play?相关内容信息

     

    640?wx_fmt=png

     

     

    推荐阅读:

    ·?如何优化您的 Android 应用 (Go 版)

    ·?应用迁移至 Android P 操作指南

    ·?Android P Beta 2 及终版 API 强势来袭!

    ·?非 SDK 接口常见问题 | Android 开发者 FAQ Vol.13

    640?wx_fmt=gif


    文章来源:https://blog.csdn.net/jILRvRTrc/article/details/80823471

    转载于:https://www.cnblogs.com/yujingyua/p/9645155.html

    展开全文
  • Android-UXSDKDemo 介绍 本UXSDKDemo专为您提供对DJI Android UX SDK的基本了解。 您将学习如何使用DJI Android UX SDK和... 您正在使用哪个Android设备和Android系统版本? 您使用的是哪个Android Studio版本? 对问
  • 您正在使用Java 8,当前版本的Java在2015年,在您的其他工作,并希望在Android中使用它。 解 启用“Jack”编译器链,并使用Android Studio中支持的Java 8子集。 讨论 如果你首先是一个Java开发人员,你可能认为...
    1.8在Android Studio 2中使用Java 8功能


    问题
    您正在使用Java 8,当前版本的Java在2015年,在您的其他工作,并希望在Android中使用它。

    启用“Jack”编译器链,并使用Android Studio中支持的Java 8子集。
    讨论
    如果你首先是一个Java开发人员,你可能认为Android将完全支持当前版本的Java是公理的。你会错了。部分原因是由于Oracle的诉讼,部分原因是它不是他们的首要任务,Android在采用当前的Java SE版本时速度很慢。使用Android Nougat(7.0),Android团队已开始转向Java(Java 8)的当前版本,但部分和增量。好消息是,Android库的许多Java兼容部分显然是基于来自OpenJDK 8的源代码,因此令人讨厌的小不一致的数量应该随着时间的推移而减少。注意,为了编译Android Nougat,您必须安装Java 8 SDK,即使您没有使用任何这些功能!
    “Jack”(Java编译工具包?)是一个新的工具链,它将Java代码编译成自己的格式 - 没有更多的类文件到Dex翻译。这应该更快,但也意味着工具像findbugs读取.class文件将不再工作,没有额外的编译步骤。

    要使用Jack,您必须具有Android Studio 2.1或更高版本以及Build Tools软件包24或更高版本。并且必须在build.gradle或模块设置中将Source和Target编译级别设置为1.8。另外,从当前预览,您必须手动添加jackOptions使能条目到build.gradle,在defaultConfig条目内:

    android {
    defaultConfig {
    // Other defaults here...
    // Enable 'jack'
    jackOptions {
    enabled true
    }
    }
    // And if you prefer to set these manually:
    compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
    }
    }


    截至本文写作(2016年6月),示例1-5中显示的语言功能和示例1-6中的API功能正在工作。
    实施例1-5。 Java 8语言特性
    •Lambda表达式(也可在API级别23和更低版本上使用)
    •方法引用(也可在API级别23和更低版本上使用)
    •默认和静态接口方法
    •多次使用注释
    其中,Lambda表达式是最有名的并且可以说是最重要的,但其他表达式是重要的。
    实施例1-6。 Java 8 API
    •反射和语言相关的API:
    - java.lang.FunctionalInterface
    - java.lang.annotation.Repeatable
    - java.lang.reflect.Method.isDefault()
    - 与多次使用的注释相关的反射API,例如AnnotatedElement.getAnnotationsByType(Class)
    •实用程序API:
    - java.util.function
    - java.util.stream
    这些实用程序API支持函数式编程和组合。
    还有很多其他重要的API,似乎很快就会出现在Android上,例如非常有用的日期和时间API java.time。当然,只有时间会告诉这些是否包括。在此期间,您可以使用它的变体。

    展开全文
  • 因此,我选择弃用setup-android,并将PR提交给正在使用它的活动项目,而不再使用setup-android。 通过该操作,可以在具有已安装的SDK软件包列表中几乎所有内容的Android SDK环境中构建Android应用。 如果发现...
  • 如果您正在考虑添加一些重要的内容,请在论坛或#freenode上与我们联系,先讨论一下; 它应该使拉取请求更快。 许可和版权 除非另有说明,否则所有代码均根据GPLv2许可提供。 请参阅LICENSE.txt以获取完整许可证。 ...
  • 正在孟加拉国达卡上关于Android应用程序开发的现场课程(有关详细课程大纲,请参见此处: : )。 我将在此存储库中添加我的培训计划的所有源代码。 将在这里逐步找到源代码和Android App开发培训的主题。 ...
  • 这是一个应用程序,可使用Android 9(Pie)及更高版本设备中的Bluetooth HID设备配置文件以鼠标或键盘的形式控制的PC,Mac,电视,ipad等。 App目前正在开发中。 我和Dima Rostopira( )是该项目的合作者,尽管...
  • 该项目有使用Android Studio 1、2和3,Gradle,CMake,Android NDK和SWIG来自动编译和设置C ++库和Java包装程序的完整示例。 此处详细说明: : (正在等待更新以包括CMake) Android Studio 2/3 由于Android ...
  • 你的照片观看 我刚刚发布了一个的。 它被称为Your Photos Watch ,它... 想想那些时候,您正在寻找一款应用程序来完成特定的事情,却没有找到适合您的方式运行的应用程序。 构建该应用程序并将其发布! 其他人也会发
  • wsmobile 欢迎。 在这里可以跟踪wsmobile的发展。... 使用Microsoft的Xamarin平台制作而成,该平台允许使用.NET框架在Android OS上进行开发,即可以在Visual Studio中使用C#构建完全本机的Android应用程序。
  • 该项目正在使用Firebase Cloud Firestore作为数据库。 使用FirestoreRecyclerAdapter填充RecyclerView 在Android Studio中创建创建项目之前,应该: 创建Firebase项目。 转到数据库菜单,然后选择Cloud ...
  • Android BackBlaze Helper是一个android库,可轻松使用Backblaze功能。 特征 将文件上传到Backblaze存储桶 选择文件类型 显示上传进度 上载多个文件 我正在开发更多的期货... 正在安装 步骤1.将JitPack存储库添加到...
  • android onNewIntent使用详解

    千次阅读 2014-03-25 14:01:44
    Android应用程序开发的时候,从一个Activity启动另一个Activity并传递一些数据到新的Activity上非常简单,但是当需要让后台运行的Activity回到前台并传递一些数据可能就会存在一点点小问题。 首先,在默认...
  • 一个用于主要活动,另一个用于计算器中正在使用的功能。 我们还有两个 xml 文件,一个在 res/layout ,它为计算器提供基本布局,一个在 res/drawable 下,它为布局中使用的按钮提供设计。 对于计算器的图标,使用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,236
精华内容 494
关键字:

您正在使用android