最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
) {
var intent = Intent()
if (clickType == 1) {
intent.setClass(this, PushActivity::class.java)
} else if (clickType == 2) {
intent.setClass(this, ScreenPushActivity::class.java)
}
intent.putExtra(Constants.INTENT_URL_PUSH, pushURL)
intent.putExtra(Constants.INTENT_URL_PLAY_RTMP, rtmpPlayURL)
intent.putExtra(Constants.INTENT_URL_PLAY_FLV, flvPlayURL)
intent.putExtra(Constants.INTENT_URL_PLAY_HLS, hlsPlayURL)
intent.putExtra(Constants.INTENT_URL_PLAY_ACC, realtimePlayURL)
startActivity(intent)
}
其中pushURL为推流地址,另外4个为拉流地址。
[]( )第三步 推流
--------------------------------------------------------------------
### []( )摄像头推流
package com.z.zplay;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.king.zxing.util.CodeUtils;
import com.tencent.live2.V2TXLiveDef;
import com.tencent.live2.V2TXLivePusher;
import com.tencent.live2.impl.V2TXLivePusherImpl;
import com.tencent.rtmp.TXLiveConstants;
import com.tencent.rtmp.TXLog;
import com.tencent.rtmp.ui.TXCloudVideoView;
import static com.tencent.live2.V2TXLiveCode.V2TXLIVE_ERROR_INVALID_LICENSE;
import static com.tencent.live2.V2TXLiveDef.V2TXLiveVideoResolutionMode.V2TXLiveVideoResolutionModeLandscape;
import static com.tencent.live2.V2TXLiveDef.V2TXLiveVideoResolutionMode.V2TXLiveVideoResolutionModePortrait;
//先推流,后创建IM
public class PushActivity extends AppCompatActivity {
private V2TXLivePusher mLivePusher;
private TXCloudVideoView mPusherView;
private static final String TAG = "PushActivity";
private String mPusherURL = ""; // 推流地址
private String mRTMPPlayURL = ""; // RTMP 拉流地址
private String mFlvPlayURL = ""; // flv 拉流地址
private String mHlsPlayURL = ""; // hls 拉流地址
private String mRealtimePlayURL = ""; // 低延时拉流地址
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_push);
initData();
initPusher();
startPush();
}
private void initData() {
Intent intent = getIntent();
mPusherURL = intent.getStringExtra(Constants.INTENT_URL_PUSH);
mRTMPPlayURL = intent.getStringExtra(Constants.INTENT_URL_PLAY_RTMP);
mFlvPlayURL = intent.getStringExtra(Constants.INTENT_URL_PLAY_FLV);
mHlsPlayURL = intent.getStringExtra(Constants.INTENT_URL_PLAY_HLS);
mRealtimePlayURL = intent.getStringExtra(Constants.INTENT_URL_PLAY_ACC);
Bitmap qrCode = CodeUtils.createQRCode(mRTMPPlayURL, 200);
ImageView ivCode = findViewById(R.id.iv_code);
ivCode.setImageBitmap(qrCode);
}
private void initPusher() {
mPusherView = findViewById(R.id.pusher_tx_cloud_view);
mLivePusher = new V2TXLivePusherImpl(this, V2TXLiveDef.V2TXLiveMode.TXLiveMode_RTMP);
}
private void startPush() {
mLivePusher.setRenderView(mPusherView);
mLivePusher.startCamera(true);
mLivePusher.startPush(mPusherURL);
}
@Override
protected void onDestroy() {
super.onDestroy();
mLivePusher.stopCamera();
mLivePusher.stopPush();
}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context=".PushActivity">
<com.tencent.rtmp.ui.TXCloudVideoView
android:id="@+id/pusher_tx_cloud_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ImageView
android:id="@+id/iv_code"
android:layout_width="100dp"
android:layout_height="100dp" />
### []( )录屏推流
package com.z.zplay;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.king.zxing.util.CodeUtils;
import com.tencent.live2.V2TXLiveDef;
import com.tencent.live2.V2TXLivePusher;
import com.tencent.live2.impl.V2TXLivePusherImpl;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import static com.tencent.live2.V2TXLiveCode.V2TXLIVE_OK;
public class ScreenPushActivity extends AppCompatActivity {
private Button btn_start_push;
private static V2TXLivePusher sLivePusher;
private String mPusherURL = ""; // 推流地址
private String mRTMPPlayURL = ""; // RTMP 拉流地址
private String mFlvPlayURL = ""; // flv 拉流地址
private String mHlsPlayURL = ""; // hls 拉流地址
private String mRealtimePlayURL = ""; // 低延时拉流地址
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_screen_push);
btn_start_push = findViewById(R.id.btn_start_push);
initData();
btn_start_push.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startPush(mPusherURL);
}
});
}
private void initData() {
Intent intent = getIntent();
mPusherURL = intent.getStringExtra(Constants.INTENT_URL_PUSH);
mRTMPPlayURL = intent.getStringExtra(Constants.INTENT_URL_PLAY_RTMP);
mFlvPlayURL = intent.getStringExtra(Constants.INTENT_URL_PLAY_FLV);
mHlsPlayURL = intent.getStringExtra(Constants.INTENT_URL_PLAY_HLS);
mRealtimePlayURL = intent.getStringExtra(Constants.INTENT_URL_PLAY_ACC);
Bitmap qrCode = CodeUtils.createQRCode(mRTMPPlayURL, 200);
ImageView ivCode = findViewById(R.id.iv_code);
ivCode.setImageBitmap(qrCode);
}
private void startPush(String pushURL) {
sLivePusher = new V2TXLivePusherImpl(this, V2TXLiveDef.V2TXLiveMode.TXLiveMode_RTMP);
sLivePusher.startMicrophone();
sLivePusher.startScreenCapture();
int result = sLivePusher.startPush(pushURL);
if (result == V2TXLIVE_OK) {
Toast.makeText(this, "push成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "push失败", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
sLivePusher.stopScreenCapture();
sLivePusher.setObserver(null);
sLivePusher.stopPush();
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context=".ScreenPushActivity">
<ImageView
android:id="@+id/iv_code"
android:layout_width="100dp"
android:layout_height="100dp" />
<Button
android:id="@+id/btn_start_push"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开始录屏推流" />
录屏推流需要多增加一个activity配置
<activity
android:name="com.tencent.rtmp.video.TXScreenCapture$TXScreenCaptureAssistantActivity"
android:theme="@android:style/Theme.Translucent" />
[]( )第四步 拉流
--------------------------------------------------------------------
package com.z.zplay;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.tencent.live2.V2TXLiveDef;
import com.tencent.live2.V2TXLivePlayer;
import com.tencent.live2.impl.V2TXLivePlayerImpl;
import com.tencent.rtmp.ui.TXCloudVideoView;
public class GetPushActivity extends AppCompatActivity {
//这个URL就是推流生成的二维码的数据
private String mPlayURL = "";
private V2TXLivePlayer mLivePlayer; //直播拉流的视频播放器
private TXCloudVideoView mVideoView;
private V2TXLiveDef.V2TXLiveFillMode mRenderMode = V2TXLiveDef.V2TXLiveFillMode.V2TXLiveFillModeFit; //Player 当前渲染模式
private V2TXLiveDef.V2TXLiveRotation mRenderRotation = V2TXLiveDef.V2TXLiveRotation.V2TXLiveRotation0; //Player 当前渲染角度
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_get_push);
mPlayURL = getIntent().getStringExtra(Constants.INTENT_URL);
mVideoView = (TXCloudVideoView) findViewById(R.id.liveplayer_video_view);
mLivePlayer = new V2TXLivePlayerImpl(this);
startPlay();
}
private void startPlay() {
String playURL = mPlayURL;
mLivePlayer.setRenderView(mVideoView);
mLivePlayer.setRenderRotation(mRenderRotation);
mLivePlayer.setRenderFillMode(mRenderMode);
mLivePlayer.startPlay(playURL);
}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".GetPushActivity">
<com.tencent.rtmp.ui.TXCloudVideoView
android:id="@+id/liveplayer_video_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
最后
感觉现在好多人都在说什么安卓快凉了,工作越来越难找了。又是说什么程序员中年危机啥的,为啥我这年近30的老农根本没有这种感觉,反倒觉得那些贩卖焦虑的都是瞎j8扯谈。当然,职业危机意识确实是要有的,但根本没到那种草木皆兵的地步好吗?
Android凉了都是弱者的借口和说辞。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
所以,最后这里放上我耗时两个月,将自己8年Android开发的知识笔记整理成的Android开发者必知必会系统学习资料笔记,上述知识点在笔记中都有详细的解读,里面还包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。
以上全套学习笔记面试宝典,吃透一半保你可以吊打面试官,只有自己真正强大了,有核心竞争力,你才有拒绝offer的权力,所以,奋斗吧!骚年们!千里之行,始于足下。种下一颗树最好的时间是十年前,其次,就是现在。
最后,赠与大家一句诗,共勉!
不驰于空想,不骛于虚声。不忘初心,方得始终。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
所以,最后这里放上我耗时两个月,将自己8年Android开发的知识笔记整理成的Android开发者必知必会系统学习资料笔记,上述知识点在笔记中都有详细的解读,里面还包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。
[外链图片转存中…(img-kHKdxPdM-1715810209808)]
以上全套学习笔记面试宝典,吃透一半保你可以吊打面试官,只有自己真正强大了,有核心竞争力,你才有拒绝offer的权力,所以,奋斗吧!骚年们!千里之行,始于足下。种下一颗树最好的时间是十年前,其次,就是现在。
最后,赠与大家一句诗,共勉!
不驰于空想,不骛于虚声。不忘初心,方得始终。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!