我是怎么在直播软件源码中开发邀请奖励功能的
邀请奖励功能是直播软件源码中非常常见的功能之一,通过用户自身的社交关系网,为平台实现推广引流作用,今天就来讲讲,邀请功能的实现方式,最终效果图如下图所示:
一、直播软件源码中邀请功能的实现机制
用户在个人中心点击邀请奖励功能,打开功能页面,页面将展示用户的邀请码,点击复制按钮,可以把邀请码复制到剪贴板上发送给别人,也可点击右上角的分享按钮,弹窗分享弹窗,选择分享的渠道,将用户的名片分享在其他社交app中。
名片上有该用户邀请码和二维码。新用户方扫描二维码会打开app的下载链接,下载并注册登录app后会成为该用户的下级。新用户也可以在app首页的邀请码弹窗中手动输入对方的邀请码并成为对方的下级。
二、 实现直播软件源码邀请功能的代码如下
public class ThreeDistributActivity extends AbsActivity implements View.OnClickListener, LiveShareDialogFragment.ActionListener { private ProgressBar mProgressBar; private WebView mWebView; private final int CHOOSE = 100;//Android 5.0以下的 private final int CHOOSE_ANDROID_5 = 200;//Android 5.0以上的 private ValueCallback<Uri> mValueCallback; private ValueCallback<Uri[]> mValueCallback2; private TextView mInviteCode;//邀请码 private View mContainer; private ImageView mQrCode;//二维码 private File mShareImageFile;//分享图片文件 private MobShareUtil mMobShareUtil; @Override protected int getLayoutId() { return R.layout.activity_three_distribut; } @Override protected void main() { Intent intent = getIntent(); setTitle(intent.getStringExtra(Constants.TIP)); mContainer = findViewById(R.id.share_container); ImageView mAppIcon = findViewById(R.id.app_icon); TextView mAppName = findViewById(R.id.app_name); CommonAppConfig appConfig = CommonAppConfig.getInstance(); mAppIcon.setImageResource(appConfig.getAppIconRes()); mAppName.setText(appConfig.getAppName()); ImageView avatar = findViewById(R.id.avatar); TextView name = findViewById(R.id.name); TextView idVal = findViewById(R.id.id_val); mInviteCode = findViewById(R.id.invite_code); mQrCode = findViewById(R.id.qr_code); findViewById(R.id.btn_share).setOnClickListener(this); UserBean u = appConfig.getUserBean(); if (u != null) { ImgLoader.displayAvatar(mContext, u.getAvatar(), avatar); name.setText(u.getUserNiceName()); idVal.setText(StringUtil.contact("ID:", u.getId())); } String url = intent.getStringExtra(Constants.URL); L.e("H5--->" + url); LinearLayout container = (LinearLayout) findViewById(R.id.container); mProgressBar = (ProgressBar) findViewById(R.id.progressbar); mWebView = new WebView(mContext); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); params.topMargin = DpUtil.dp2px(1); mWebView.setLayoutParams(params); mWebView.setOverScrollMode(View.OVER_SCROLL_NEVER); container.addView(mWebView); mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { L.e("H5-------->" + url); if (url.startsWith(Constants.COPY_PREFIX)) { String content = url.substring(Constants.COPY_PREFIX.length()); if (!TextUtils.isEmpty(content)) { copy(content); } } else { view.loadUrl(url); } return true; } @Override public void onPageFinished(WebView view, String url) { setTitle(view.getTitle()); } }); mWebView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { if (newProgress == 100) { mProgressBar.setVisibility(View.GONE); } else { mProgressBar.setProgress(newProgress); } } //以下是在各个Android版本的直播源码中, WebView调用文件选择器的方法 // For Android < 3.0 public void openFileChooser(ValueCallback<Uri> valueCallback) { openImageChooserActivity(valueCallback); } // For Android >= 3.0 public void openFileChooser(ValueCallback valueCallback, String acceptType) { openImageChooserActivity(valueCallback); } //For Android >= 4.1 public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) { openImageChooserActivity(valueCallback); } // For Android >= 5.0 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) { mValueCallback2 = filePathCallback; Intent intent = fileChooserParams.createIntent(); startActivityForResult(intent, CHOOSE_ANDROID_5); return true; } }); mWebView.getSettings().setJavaScriptEnabled(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } mWebView.loadUrl(url); MainHttpUtil.getQrCode(new HttpCallback() { @Override public void onSuccess(int code, String msg, String[] info) { if (code == 0 && info.length > 0) { JSONObject obj = JSON.parseObject(info[0]); if (mInviteCode != null) { mInviteCode.setText(obj.getString("code")); } if (mQrCode != null) { ImgLoader.display(mContext, obj.getString("qr"), mQrCode); } } } }); } private void openImageChooserActivity(ValueCallback<Uri> valueCallback) { mValueCallback = valueCallback; Intent intent = new Intent(); if (Build.VERSION.SDK_INT < 19) { intent.setAction(Intent.ACTION_GET_CONTENT); } else { intent.setAction(Intent.ACTION_PICK); intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI); } intent.setType("image/*"); startActivityForResult(Intent.createChooser(intent, WordUtil.getString(com.yunbao.common.R.string.choose_flie)), CHOOSE); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); switch (requestCode) { case CHOOSE://5.0以下选择图片后的回调 processResult(resultCode, intent); break; case CHOOSE_ANDROID_5://5.0以上选择图片后的回调 processResultAndroid5(resultCode, intent); break; } } private void processResult(int resultCode, Intent intent) { if (mValueCallback == null) { return; } if (resultCode == RESULT_OK && intent != null) { Uri result = intent.getData(); mValueCallback.onReceiveValue(result); } else { mValueCallback.onReceiveValue(null); } mValueCallback = null; } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) private void processResultAndroid5(int resultCode, Intent intent) { if (mValueCallback2 == null) { return; } if (resultCode == RESULT_OK && intent != null) { mValueCallback2.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent)); } else { mValueCallback2.onReceiveValue(null); } mValueCallback2 = null; } protected boolean canGoBack() { return mWebView != null && mWebView.canGoBack(); } @Override public void onBackPressed() { if (isNeedExitActivity()) { finish(); } else { if (canGoBack()) { mWebView.goBack(); } else { finish(); } } } private boolean isNeedExitActivity() { if (mWebView != null) { String url = mWebView.getUrl(); if (!TextUtils.isEmpty(url)) { return url.contains("g=Appapi&m=Auth&a=success")//身份认证成功页面 || url.contains("g=Appapi&m=Family&a=home");//家族申请提交成功页面 } } return false; } public static void forward(Context context, String title, String url) { url = StringUtil.contact(url, "&uid=", CommonAppConfig.getInstance().getUid(), "&token=", CommonAppConfig.getInstance().getToken()); Intent intent = new Intent(context, ThreeDistributActivity.class); intent.putExtra(Constants.URL, url); intent.putExtra(Constants.TIP, title); context.startActivity(intent); } @Override protected void onDestroy() { MainHttpUtil.cancel(MainHttpConsts.GET_QR_CODE); if (mWebView != null) { ViewGroup parent = (ViewGroup) mWebView.getParent(); if (parent != null) { parent.removeView(mWebView); } mWebView.destroy(); } super.onDestroy(); } /** * 复制到剪贴板 */ private void copy(String content) { ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); ClipData clipData = ClipData.newPlainText("text", content); cm.setPrimaryClip(clipData); ToastUtil.show(R.string.copy_success); } /** * 生成分享图片 */ private void saveBitmapFile() { PermissionUtil.request(this, new PermissionCallback() { @Override public void onAllGranted() { if (mContainer == null) { return; } mContainer.setDrawingCacheEnabled(true); Bitmap bitmap = mContainer.getDrawingCache(); bitmap = Bitmap.createBitmap(bitmap); mContainer.setDrawingCacheEnabled(false); File dir = new File(CommonAppConfig.CAMERA_IMAGE_PATH); if (!dir.exists()) { dir.mkdirs(); } mShareImageFile = new File(dir, Constants.SHARE_QR_CODE_FILE); boolean result = BitmapUtil.getInstance().saveBitmap(bitmap, mShareImageFile); if (result) { if (bitmap != null && !bitmap.isRecycled()) { bitmap.recycle(); } LiveShareDialogFragment fragment = new LiveShareDialogFragment(); fragment.setNoLink(true); fragment.setActionListener(ThreeDistributActivity.this); fragment.show(getSupportFragmentManager(), "LiveShareDialogFragment"); } } }, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE); } @Override public void onClick(View v) { if (v.getId() == R.id.btn_share) { saveBitmapFile(); } } @Override public void onItemClick(String type) { if (mShareImageFile == null) { return; } if (mMobShareUtil == null) { mMobShareUtil = new MobShareUtil(); } mMobShareUtil.shareImage(mContext, type, mShareImageFile.getPath(), null); } }
以上就是小云豹对于直播软件源码中邀请奖励功能部分开发的代码,大家可直接取用,最近随着腾讯系、头条系、阿里系几家争锋不断,链接形式分享直播间会越来越容易被封链接,而分享二维码拉人方式的优势正逐渐显现出来,以对抗腾讯系产品对其他家产品的“分享封杀”政策。
声明:以上内容为云豹科技作者本人原创,未经作者本人同意,禁止转载,否则将追究相关法律责任www.yunbaokj.com