Android get/ post 方法 传递网络数据 -简单的翻译功能实现(GET)

Android get/ post 方法 传递网络数据 -简单的翻译功能实现(GET)

学习android不久,最近学习了android的Get 和Post方法传递数据,相对与罗列书上的知识不如来动手写个小demo乐趣更多,来和我一起动手来实现简单的翻译功能的小demo吧!超简单!:

  • 注册有道翻译API(百度翻译、金山词霸等都可)
  • 创建android项目
  • 创建布局界面
  • 创建get/post请求
  • 获取返回的数据
  • 显示获取到的数据

GET方法小解:

1.Get方式在通过URL提交数据,数据在URL中可以看到。
2.GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
3.使用 Get 的时候,参数会显示在地址栏上,如果这些数据是中文数据而且是非敏感数据的使用 get。

我们在百度搜索CSDN 时可以看到地址栏 www.baidu.com/s?wd=CSDN 即是向www.baidu.com/s使用get方法传入wd的为CSDN,来请求搜索”CSDN”
图片名称
下面来学习如何在安卓中使用Get请求

编写activity_main.xml

图片名称

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入要翻译的内容" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="翻译" />

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

布局 很简单 edittext 来获取输入的文本 button 来触发网络请求 textview来显示返回的内容。

本编辑器支持 Markdown Extra ,  扩展了很多好用的功能。具体请参考[Github][2].

编辑MainActivity.java

MainActivity.java

package com.qqnum.getdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    EditText editText;
    Button button;
    TextView textView;
    String ApiUrl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText) findViewById(R.id.edit);
        button = (Button) findViewById(R.id.button);
        textView = (TextView) findViewById(R.id.text);
        //有道翻译的api
        ApiUrl = "http://fanyi.youdao.com/openapi.do?keyfrom=MyFristBlog&key=1985316716&type=data&doctype=json&version=1.1&q=";
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //开启线程来发起网络请求
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            //创建get 请求
                            URL url = new URL(ApiUrl + editText.getText().toString());
                            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
                            connection.setRequestMethod("GET");
                            //接收返回的内容
                            InputStream inputStream = connection.getInputStream();
                            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
                            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                            String textline; //用来记录每一行内容
                            StringBuilder gettext = new StringBuilder();//储存每一行内容
                            while ((textline = bufferedReader.readLine()) != null) {
                                gettext.append(textline);
                            }
                            //关闭读写
                            bufferedReader.close();
                            inputStreamReader.close();
                            inputStream.close();
                            setText(gettext);//设置文本的方法
                        } catch (MalformedURLException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
        });
    }
        //设置文本的方法
    public void setText(final StringBuilder text) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //一定要在UI线程(主线程)中更新界面
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText(text);
                    }
                });
            }
        }).start();
    }
}
发送请求

首先在监听事件中开启一个线程,创建URL对象,这里设置为我们在有道翻译申请的 api地址。然后使用HttpURLConnection 发送http请求,请求的目标就是传入的有道翻译api地址,setRequestMethod("GET")方法来设置请求方式(不设置是默认为 Get方式)。

接收返回的数据

使用InputStreamReader 来对返回的数据进行读取,然后用while ((textline = bufferedReader.readLine()) != null) { gettext.append(textline); }来将每一行添加到gettext中并传给setText()方法来更新textview中的内容。

将返回的数据显示到textview

创建一个线程,一定要在UI线程(主线程)中更新界面,用setText()方法设置显示的文本。
最后别忘了加入网络权限,在AndroidManifest.xml 加入
<uses-permission android:name="android.permission.INTERNET"/>
图片名称
看到这么多字符串是不是有点乱呢?之后的文章会来写如何解析json

注册有道翻译api

源码地址

http://oiskisse7.bkt.clouddn.com/app/GETdemo.zip
第一次写文章,知识尚浅,还请大神斧正
下一篇 文章将写如何用post方法来获取天气数据

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的示例代码,用于使用MediaCodec录制屏幕并计算实时时长: ```java public class ScreenRecorder { private static final String TAG = "ScreenRecorder"; private static final String MIME_TYPE = "video/avc"; private static final int FRAME_RATE = 30; private static final int I_FRAME_INTERVAL = 10; private static final int TIMEOUT_US = 10000; private MediaProjection mMediaProjection; private MediaCodec mMediaCodec; private MediaMuxer mMuxer; private Surface mInputSurface; private int mTrackIndex = -1; private boolean mMuxerStarted = false; private long mStartTime; private long mLastPresentationTimeUs; private long mElapsedRealtimeOffset; private Handler mHandler; private Runnable mCallback; public ScreenRecorder(MediaProjection mediaProjection) { mMediaProjection = mediaProjection; } public void start(String outputPath) throws IOException { prepareEncoder(outputPath); mMediaProjection.registerCallback(mProjectionCallback, mHandler); mMediaProjection.createVirtualDisplay( "Recording Display", DisplayMetrics.DENSITY_MEDIUM, DisplayMetrics.DENSITY_MEDIUM, DisplayMetrics.DENSITY_DEFAULT, DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION, mInputSurface, null, null); } public void stop() { if (mMediaProjection != null) { mMediaProjection.unregisterCallback(mProjectionCallback); mMediaProjection.stop(); mMediaProjection = null; } releaseEncoder(); } public void setHandler(Handler handler, Runnable callback) { mHandler = handler; mCallback = callback; } private void prepareEncoder(String outputPath) throws IOException { MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, getScreenWidth(), getScreenHeight()); format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface); format.setInteger(MediaFormat.KEY_BIT_RATE, getBitRate()); format.setInteger(MediaFormat.KEY_FRAME_RATE, FRAME_RATE); format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, I_FRAME_INTERVAL); mMediaCodec = MediaCodec.createEncoderByType(MIME_TYPE); mMediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); mInputSurface = mMediaCodec.createInputSurface(); mMediaCodec.start(); mMuxer = new MediaMuxer(outputPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); } private void releaseEncoder() { if (mMediaCodec != null) { mMediaCodec.stop(); mMediaCodec.release(); mMediaCodec = null; } if (mMuxer != null) { if (mMuxerStarted) { mMuxer.stop(); } mMuxer.release(); mMuxer = null; mMuxerStarted = false; } if (mInputSurface != null) { mInputSurface.release(); mInputSurface = null; } } private int getScreenWidth() { DisplayMetrics displayMetrics = new DisplayMetrics(); WindowManager windowManager = (WindowManager) App.getContext().getSystemService(Context.WINDOW_SERVICE); windowManager.getDefaultDisplay().getMetrics(displayMetrics); return displayMetrics.widthPixels; } private int getScreenHeight() { DisplayMetrics displayMetrics = new DisplayMetrics(); WindowManager windowManager = (WindowManager) App.getContext().getSystemService(Context.WINDOW_SERVICE); windowManager.getDefaultDisplay().getMetrics(displayMetrics); return displayMetrics.heightPixels; } private int getBitRate() { return getScreenWidth() * getScreenHeight() * FRAME_RATE * 5; } private void drainEncoder(boolean endOfStream) { if (endOfStream) { mMediaCodec.signalEndOfInputStream(); } ByteBuffer[] encoderOutputBuffers = mMediaCodec.getOutputBuffers(); while (true) { int index = mMediaCodec.dequeueOutputBuffer(new MediaCodec.BufferInfo(), TIMEOUT_US); if (index == MediaCodec.INFO_TRY_AGAIN_LATER) { if (!endOfStream) { break; } } else if (index == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { MediaFormat format = mMediaCodec.getOutputFormat(); mTrackIndex = mMuxer.addTrack(format); mMuxer.start(); mMuxerStarted = true; } else if (index < 0) { Log.e(TAG, "Unexpected result from dequeueOutputBuffer: " + index); } else { ByteBuffer encodedData = encoderOutputBuffers[index]; if (encodedData == null) { throw new RuntimeException("encoderOutputBuffer " + index + " was null"); } if ((mLastPresentationTimeUs == 0 && mStartTime != 0) || (mLastPresentationTimeUs != 0 && mStartTime == 0)) { mStartTime = System.currentTimeMillis(); mElapsedRealtimeOffset = SystemClock.elapsedRealtime(); } if (mStartTime != 0) { long presentationTimeUs = System.currentTimeMillis() - mStartTime + mElapsedRealtimeOffset; MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); bufferInfo.flags = encodedData.get(4); bufferInfo.offset = 0; bufferInfo.size = encodedData.limit(); bufferInfo.presentationTimeUs = presentationTimeUs * 1000; mMuxer.writeSampleData(mTrackIndex, encodedData, bufferInfo); mLastPresentationTimeUs = bufferInfo.presentationTimeUs; if (mHandler != null && mCallback != null) { mHandler.post(mCallback); } } mMediaCodec.releaseOutputBuffer(index, false); if ((encoderOutputBuffers[index].get(0) & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) { if (!endOfStream) { Log.e(TAG, "unexpectedly reached end of stream"); } else { mMuxerStarted = false; } break; } } } } private MediaProjection.Callback mProjectionCallback = new MediaProjection.Callback() { @Override public void onStop() { releaseEncoder(); } }; } ``` 在此代码中,我们使用MediaCodec录制屏幕,并使用MediaMuxer将录制的视频保存到文件中。我们还使用了一个Handler和Runnable回调,以便在录制过程中计算实时时长。 要使用ScreenRecorder类,您需要首先获取MediaProjection对象。这可以通过调用MediaProjectionManager.createScreenCaptureIntent()方法来完成。一旦您拥有了MediaProjection对象,您可以使用ScreenRecorder.start()方法开始录制,并使用ScreenRecorder.stop()方法停止录制。 下面是一个使用ScreenRecorder类的简单示例: ```java private MediaProjectionManager mMediaProjectionManager; private ScreenRecorder mScreenRecorder; private Handler mHandler; private void startScreenRecording() { mMediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE); startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(), REQUEST_CODE_SCREEN_CAPTURE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_SCREEN_CAPTURE && resultCode == RESULT_OK) { mScreenRecorder = new ScreenRecorder(mMediaProjectionManager.getMediaProjection(resultCode, data)); try { mScreenRecorder.setHandler(mHandler, new Runnable() { @Override public void run() { long elapsedRealtime = SystemClock.elapsedRealtime(); long elapsedRealtimeSinceStart = elapsedRealtime - mScreenRecorder.getStartTime(); long elapsedRealtimeSinceLastCallback = elapsedRealtime - mScreenRecorder.getLastCallbackTime(); Log.d(TAG, "Elapsed real time since start: " + elapsedRealtimeSinceStart + " ms"); Log.d(TAG, "Elapsed real time since last callback: " + elapsedRealtimeSinceLastCallback + " ms"); } }); mScreenRecorder.start(getVideoFilePath()); } catch (IOException e) { e.printStackTrace(); } } } private void stopScreenRecording() { if (mScreenRecorder != null) { mScreenRecorder.stop(); mScreenRecorder = null; } } @Override protected void onDestroy() { super.onDestroy(); stopScreenRecording(); } ``` 在这个示例中,我们使用了一个Handler和Runnable回调来计算实时时长。当我们调用ScreenRecorder.start()方法时,我们将这些回调传递给ScreenRecorder对象。然后,每次录制一个新帧时,我们将在Runnable回调中更新计时器。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是阿辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值