diff --git a/app/build.gradle b/app/build.gradle index 303bc4f8f4..ba0617135f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,12 @@ android { compileSdkVersion 21 buildToolsVersion "23.0.3" + /** + * 定位编译出错的图片 + */ + aaptOptions.cruncherEnabled = false + aaptOptions.useNewCruncher = false + defaultConfig { applicationId "com.gh.gamecenter" minSdkVersion 14 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 115da16725..446797f758 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + + + diff --git a/app/src/main/assets/Home.html b/app/src/main/assets/Home.html new file mode 100644 index 0000000000..b8d3890cf8 --- /dev/null +++ b/app/src/main/assets/Home.html @@ -0,0 +1,66 @@ + + + + + 光环助手 + + + + + + + + + + +
+
+ +
+ +

光环助手

+

乐于分享的人
是最帅(美)的^_^

+ +
+ + diff --git a/app/src/main/java/com/gh/base/AppController.java b/app/src/main/java/com/gh/base/AppController.java index 78a5fe1525..074142823a 100644 --- a/app/src/main/java/com/gh/base/AppController.java +++ b/app/src/main/java/com/gh/base/AppController.java @@ -23,6 +23,8 @@ import com.xiaomi.mipush.sdk.MiPushClient; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; public class AppController extends Application { @@ -39,6 +41,12 @@ public class AppController extends Application { private boolean isFinish = false; + //快传文件发送单线程 + public static Executor FILE_SENDER_EXECUTOR = Executors.newSingleThreadExecutor(); + + //快传文件发送主要的线程池 + public static Executor MAIN_EXECUTOR = Executors.newFixedThreadPool(5); + @Override public void onCreate() { super.onCreate(); diff --git a/app/src/main/java/com/gh/base/BaseActivity.java b/app/src/main/java/com/gh/base/BaseActivity.java index 1be32f438a..49b893069e 100644 --- a/app/src/main/java/com/gh/base/BaseActivity.java +++ b/app/src/main/java/com/gh/base/BaseActivity.java @@ -140,7 +140,7 @@ public class BaseActivity extends Activity implements OnCallBackListener { } } - ShareUtils.getInstance(this).showShareWindows(new View(this), url, gameName, icon, newsTitle, isPlugin); + ShareUtils.getInstance(this).showShareWindows(new View(this), url, gameName, icon, newsTitle, isPlugin, true); if (newsTitle == null) { DataUtils.onEvent(this, "内容分享", gameName); diff --git a/app/src/main/java/com/gh/base/BaseFragmentActivity.java b/app/src/main/java/com/gh/base/BaseFragmentActivity.java index fb9d54cacf..002fc2dc42 100644 --- a/app/src/main/java/com/gh/base/BaseFragmentActivity.java +++ b/app/src/main/java/com/gh/base/BaseFragmentActivity.java @@ -133,7 +133,7 @@ public class BaseFragmentActivity extends FragmentActivity { } } - ShareUtils.getInstance(this).showShareWindows(new View(this), url, gameName, icon, newsTitle, isPlugin); + ShareUtils.getInstance(this).showShareWindows(new View(this), url, gameName, icon, newsTitle, isPlugin, true); if (newsTitle == null){ DataUtils.onEvent(this, "内容分享", gameName); diff --git a/app/src/main/java/com/gh/common/util/ShareUtils.java b/app/src/main/java/com/gh/common/util/ShareUtils.java index 25c25b16b2..73d9eadd63 100644 --- a/app/src/main/java/com/gh/common/util/ShareUtils.java +++ b/app/src/main/java/com/gh/common/util/ShareUtils.java @@ -12,7 +12,6 @@ import android.graphics.Color; import android.graphics.Matrix; import android.net.Uri; import android.os.Bundle; -import android.os.Handler; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.Gravity; @@ -63,7 +62,7 @@ public class ShareUtils { private static IWXAPI api; private static Tencent mTencent; - private Handler handler; + private Boolean ispopupWindow; private int[] arrLogo = {R.drawable.share_wechat_logo, R.drawable.share_wechatmoments_logo, R.drawable.share_qq_logo , R.drawable.share_qzone_logo, R.drawable.share_sinaweibo_logo, R.drawable.share_shortmessage_logo @@ -84,21 +83,31 @@ public class ShareUtils { return instance; } - public void showShareWindows(View view, String url, String gameName, String icon ,String newsTitle, boolean isPlugin){ + /** + * + * @param view ispopupWindow-true是绑定的布局, ispopupWindow-false 则是嵌套的父控件 + * @param url 分享链接 + * @param gameName 游戏名 与 新闻标题区分 + * @param icon 分享图标 + * @param newsTitle 新闻标题 与 游戏名区分 + * @param isPlugin 判断游戏是否是插件 + * @param ispopupWindow 判断是否是 PopupWindow false可直接嵌套进布局(分享光环),view是父控件 + */ + public void showShareWindows(View view, String url, String gameName, String icon ,String newsTitle, + boolean isPlugin, boolean ispopupWindow){ this.shareIcon = icon; this.shareGameName = gameName; this.shareUrl = url; this.shareNewsTitle = newsTitle; this.isPlugin = isPlugin; + this.ispopupWindow = ispopupWindow; RelativeLayout contentView = new RelativeLayout(context); - contentView.setBackgroundColor(0x8c000000); contentView.setFocusable(true); contentView.setFocusableInTouchMode(true); RecyclerView shareRecyclerView = new RecyclerView(context); shareRecyclerView.setPadding(DisplayUtils.dip2px(context, 20), DisplayUtils.dip2px(context, 10), DisplayUtils.dip2px(context, 20), 0); - shareRecyclerView.setBackgroundColor(Color.WHITE); //RecyclerView禁止滑动 GridLayoutManager gridLayoutManager = new GridLayoutManager(context, 4){ @@ -116,6 +125,16 @@ public class ShareUtils { rlParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); contentView.addView(shareRecyclerView,rlParams); + if (!ispopupWindow) { + LinearLayout layout = (LinearLayout) view; + layout.addView(contentView); + arrLabel[7] = "邮件"; + arrLogo[7] = R.drawable.share_email_logo; + return; + } + contentView.setBackgroundColor(0x8c000000); + shareRecyclerView.setBackgroundColor(Color.WHITE); + popupWindow = new PopupWindow(contentView, LinearLayout.LayoutParams.MATCH_PARENT , LinearLayout.LayoutParams.MATCH_PARENT, true); popupWindow.setAnimationStyle(R.style.mypopwindow_anim_style); @@ -198,10 +217,24 @@ public class ShareUtils { shortMessageSahre(); break; case 6: - copyLink(shareUrl); + copyLink("推荐光环助手,绿色安全的手游加速助手:" + shareUrl); break; case 7: - popupWindow.dismiss(); + if (ispopupWindow) { + popupWindow.dismiss(); + } else { + Intent data=new Intent(Intent.ACTION_SENDTO); + data.setData(Uri.parse("mailto:")); + data.putExtra(Intent.EXTRA_SUBJECT, "快来试试光环助手"); + data.putExtra(Intent.EXTRA_TEXT, "我用光环助手一段时间了,在里面可以下载各种热门卡牌手游的加速版,绿色安全,超级省心,做日常效率提高3-5倍!\n" + + "\n" + + "不用肝的感觉真好,快来试试。\n" + + "\n" + + "光环助手官网地址:\n" + + "\n" + + "http://www.ghzhushou.com?source=appshare333"); + context.startActivity(data); + } break; } } @@ -228,22 +261,31 @@ public class ShareUtils { } //QQ分享 - private void qqSahre(){ + private void qqSahre() { Utils.toast(context,"分享跳转中..."); Bundle params = new Bundle(); - if (shareNewsTitle != null){ - params.putString(QQShare.SHARE_TO_QQ_TITLE, shareNewsTitle); - params.putString(QQShare.SHARE_TO_QQ_SUMMARY, "来自光环助手(最强卡牌神器)"); - }else { - params.putString(QQShare.SHARE_TO_QQ_TITLE, "向你推荐:"); - if (isPlugin){ - params.putString(QQShare.SHARE_TO_QQ_SUMMARY, shareGameName + "(光环加速版)"); - }else { - params.putString(QQShare.SHARE_TO_QQ_SUMMARY, shareGameName); - } - } + String title; + String summary; + if (ispopupWindow) { + if (shareNewsTitle != null) { + title = shareNewsTitle; + summary = "来自光环助手(最强卡牌神器)"; + } else { + title = "向你推荐:"; + if (isPlugin) { + summary = shareGameName + "(光环加速版)"; + } else { + summary = shareGameName; + } + } + } else { + title = "不用肝的感觉真好"; + summary = "绿色安全的手游加速助手"; + } + params.putString(QQShare.SHARE_TO_QQ_TITLE, title); + params.putString(QQShare.SHARE_TO_QQ_SUMMARY, summary); params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT); params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, shareUrl); params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, shareIcon); @@ -251,57 +293,84 @@ public class ShareUtils { mTencent.shareToQQ( (Activity) context, params,QqShareListener); - popupWindow.dismiss(); + + if (ispopupWindow) { + popupWindow.dismiss(); + } } //微信好友分享 - private void wechatSahre(){ + private void wechatSahre() { Utils.toast(context,"分享跳转中..."); WXWebpageObject webpage = new WXWebpageObject(); WXMediaMessage msg = new WXMediaMessage(webpage); webpage.webpageUrl = shareUrl; - if (shareNewsTitle != null){ - msg.title = shareNewsTitle; - msg.description = "来自光环助手(最强卡牌神器)"; - }else { - if (isPlugin){ - msg.title = "向你推荐"; - msg.description = shareGameName + "(光环加速版)"; - }else { - msg.title = "向你推荐"; - msg.description = shareGameName; + String title; + String summary; + + if (ispopupWindow) { + if (shareNewsTitle != null) { + title = shareNewsTitle; + summary = "来自光环助手(最强卡牌神器)"; + } else { + title = "向你推荐"; + if (isPlugin){ + summary = shareGameName + "(光环加速版)"; + } else { + summary = shareGameName; + } } + } else { + title = "不用肝的感觉真好"; + summary = "绿色安全的手游加速助手"; } + msg.title = title; + msg.description = summary; + SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("webpage"); req.message = msg; req.scene = SendMessageToWX.Req.WXSceneSession; loadBitMap(shareIcon, msg, req); - popupWindow.dismiss(); + if (ispopupWindow) { + popupWindow.dismiss(); + } } //QQ空间分享 - private void qZoneSahre(){ + private void qZoneSahre() { Utils.toast(context,"分享跳转中..."); Bundle params = new Bundle(); - if (shareNewsTitle != null){ - params.putString(QzoneShare.SHARE_TO_QQ_TITLE, shareNewsTitle); - }else { - params.putString(QzoneShare.SHARE_TO_QQ_TITLE, "向你推荐:"); - if (isPlugin){ - params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, shareGameName + "(光环加速版)"); - }else { - params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, shareGameName); + String title; + String summary = null; + + if (ispopupWindow) { + if (shareNewsTitle != null) { + title = shareNewsTitle; + } else { + title = "向你推荐:"; + if (isPlugin) { + summary = shareGameName + "(光环加速版)"; + } else { + summary = shareGameName; + } } + } else { + title = "不用肝的感觉真好"; + summary = "绿色安全的手游加速助手"; } ArrayList imageUrls = new ArrayList(); imageUrls.add(shareIcon); + if (summary != null) { + params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, summary); + } + params.putString(QzoneShare.SHARE_TO_QQ_TITLE, title); params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE, QzoneShare.SHARE_TO_QZONE_TYPE_NO_TYPE); params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL, shareUrl); params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrls); @@ -309,26 +378,36 @@ public class ShareUtils { mTencent.shareToQzone( (Activity) context, params,QqShareListener); - popupWindow.dismiss(); + if (ispopupWindow) { + popupWindow.dismiss(); + } } //微信朋友圈分享 - private void wechatMomentsSahre(){ + private void wechatMomentsSahre() { Utils.toast(context,"分享跳转中..."); WXWebpageObject webpage = new WXWebpageObject(); WXMediaMessage msg = new WXMediaMessage(webpage); webpage.webpageUrl = shareUrl; - if (shareNewsTitle != null){ - msg.title = shareNewsTitle; - }else { - if (isPlugin){ - msg.title = "向你推荐:" + shareGameName + "(光环加速版)"; - }else { - msg.title = "向你推荐:" + shareGameName; + + String title; + + if (ispopupWindow) { + if (shareNewsTitle != null) { + title = shareNewsTitle; + } else { + if (isPlugin){ + title = shareGameName + "(光环加速版)"; + } else { + title = shareGameName; + } } + } else { + title = "玩手游不用肝的感觉真好"; } + msg.title = title; SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("webpage"); @@ -336,12 +415,14 @@ public class ShareUtils { req.scene = SendMessageToWX.Req.WXSceneTimeline; loadBitMap(shareIcon, msg, req); - popupWindow.dismiss(); + if (ispopupWindow) { + popupWindow.dismiss(); + } } //新浪微博分享 - private void sinaWeiboSahre(){ + private void sinaWeiboSahre() { Intent intent = new Intent(context, WeiBoShareActivity.class); Bundle bundle = new Bundle(); bundle.putString("shareNewsTitle", shareNewsTitle); @@ -349,23 +430,31 @@ public class ShareUtils { bundle.putString("shareGameName", shareGameName); bundle.putString("shareUrl", shareUrl); bundle.putBoolean("isPlugin",isPlugin); + bundle.putBoolean("ispopupWindow", ispopupWindow); intent.putExtras(bundle); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); - popupWindow.dismiss(); + if (ispopupWindow) { + popupWindow.dismiss(); + } } //短信分享 - private void shortMessageSahre(){ + private void shortMessageSahre() { String smsBody; - if (shareNewsTitle != null){ - smsBody = shareNewsTitle + shareUrl; - }else { - if (isPlugin){ - smsBody = "向你推荐:" + shareGameName + "(光环加速版)" + shareUrl; + if (ispopupWindow) { + if (shareNewsTitle != null){ + smsBody = shareNewsTitle + shareUrl; }else { - smsBody = "向你推荐:" + shareGameName + shareUrl; + if (isPlugin){ + smsBody = "向你推荐:" + shareGameName + "(光环加速版)" + shareUrl; + }else { + smsBody = "向你推荐:" + shareGameName + shareUrl; + } } + } else { + smsBody = "这个App可以下载各种热门卡牌手游的加速版,绿色安全,超级省心,做日常效率提高3-5倍!光环助手官网:" + shareUrl; } Intent sendIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("smsto:")); @@ -379,7 +468,9 @@ public class ShareUtils { e.printStackTrace(); } - popupWindow.dismiss(); + if (ispopupWindow) { + popupWindow.dismiss(); + } } private String buildTransaction(final String type) { @@ -390,9 +481,12 @@ public class ShareUtils { private void copyLink(String copyContent) { ClipboardManager cmb = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); cmb.setText(copyContent); - popupWindow.dismiss(); - - Utils.toast(context,"复制成功"); + if (ispopupWindow != null && ispopupWindow) { + popupWindow.dismiss(); + Utils.toast(context,"复制成功,请到微信/QQ粘贴分享"); + } else { + Utils.toast(context,"复制成功"); + } } private void loadBitMap(final String iconUrl, final WXMediaMessage msg, final SendMessageToWX.Req req){ diff --git a/app/src/main/java/com/gh/gamecenter/ShareGhActivity.java b/app/src/main/java/com/gh/gamecenter/ShareGhActivity.java new file mode 100644 index 0000000000..1e924452da --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ShareGhActivity.java @@ -0,0 +1,80 @@ +package com.gh.gamecenter; + +import android.content.ClipboardManager; +import android.content.Context; +import android.content.Intent; +import android.graphics.BitmapFactory; +import android.os.Bundle; +import android.text.Html; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.gh.base.BaseActivity; +import com.gh.common.util.QRCodeUtils; +import com.gh.common.util.ShareUtils; +import com.gh.common.util.Utils; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + +/** + * Created by khy on 2017/2/6. + */ +public class ShareGhActivity extends BaseActivity { + + @BindView(R.id.gh_address_qrcode) ImageView mGhQrcode; + @BindView(R.id.gh_address_tv) TextView mGhAddress; + @BindView(R.id.wifi_share_btn) Button mWifiShareBtn; + @BindView(R.id.content_ll) LinearLayout mContentLl; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + View contentView = View.inflate(this, R.layout.activity_share_gh, null); + init(contentView, "分享光环"); + ButterKnife.bind(this); + + mGhAddress.setText(Html.fromHtml(""+"www.ghzhushou.com"+"")); + createQrCode(); + ShareUtils.getInstance(this).showShareWindows(mContentLl, "http://www.ghzhushou.com?source=appshare300", "光环助手" + , "http://image.ghzhushou.com/pic/57d604808ab49e467d8b4568.png", null, false, false); + } + + @OnClick(R.id.wifi_share_btn) + public void skipWifiShare() { + Intent intent = new Intent(this, ShareGhWfifActivity.class); + startActivity(intent); + } + + @OnClick(R.id.gh_address_tv) + public void copyAddress() { + ClipboardManager cmb = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + cmb.setText("http://www.ghzhushou.com?source=appshare100"); + + Utils.toast(this, "网址复制成功"); + } + + + private void createQrCode() { + new Thread(new Runnable() { + @Override + public void run() { + final String filePath = getExternalCacheDir().getPath() + "/ShareImg/ShareQRCode.jpg"; + boolean success = QRCodeUtils.createQRImage("www.ghzhushou.com" + , 200, 200, filePath, ShareGhActivity.this); + if (success) { + runOnUiThread(new Runnable() { + @Override + public void run() { + mGhQrcode.setImageBitmap(BitmapFactory.decodeFile(filePath)); + } + }); + } + } + }).start(); + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ShareGhWfifActivity.java b/app/src/main/java/com/gh/gamecenter/ShareGhWfifActivity.java new file mode 100644 index 0000000000..74c30bfebe --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ShareGhWfifActivity.java @@ -0,0 +1,257 @@ +package com.gh.gamecenter; + +import android.content.IntentFilter; +import android.os.Bundle; +import android.view.View; +import android.widget.TextView; + +import com.gh.base.AppController; +import com.gh.base.BaseActivity; +import com.gh.common.util.DialogUtils; +import com.gh.common.util.RandomUtils; +import com.gh.common.util.Utils; +import com.gh.gamecenter.entity.KcWebRequestEntity; +import com.gh.gamecenter.kuaichuan.Constant; +import com.gh.gamecenter.kuaichuan.DownloadUriHandler; +import com.gh.gamecenter.kuaichuan.HotspotManager; +import com.gh.gamecenter.kuaichuan.HtmlUriHandler; +import com.gh.gamecenter.kuaichuan.ImageUriHandler; +import com.gh.gamecenter.kuaichuan.KcUriHandler; +import com.gh.gamecenter.kuaichuan.WifiMgr; +import com.gh.gamecenter.kuaichuan.WifiUtils; +import com.gh.gamecenter.receiver.WifiAPBroadcastReceiver; + +import java.io.IOException; +import java.io.InputStream; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + +/** + * Created by khy on 2017/2/6. + */ +public class ShareGhWfifActivity extends BaseActivity { + + @BindView(R.id.hotspot_name) TextView mHotSpotName; + + private ServerSocket mServerSocket; + + private WifiAPBroadcastReceiver mWifiAPBroadcastReceiver; + + private boolean mIsInitialized = false; + + private List mUriHandlers; + + private boolean isColseActivity; + + private boolean isOpenWifi; //记录开热点前的WiFi状态 + + private String mySsid; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + View contentView = View.inflate(this, R.layout.activity_share_gh_wifi, null); + init(contentView, "分享光环"); + ButterKnife.bind(this); + + mUriHandlers = new ArrayList<>(); + mUriHandlers.add(new HtmlUriHandler(this)); + mUriHandlers.add(new ImageUriHandler(this)); + mUriHandlers.add(new DownloadUriHandler(this)); + + isColseActivity = false; + + if (WifiMgr.getInstance(this).isWifiEnable()) { + isOpenWifi = true; + WifiMgr.getInstance(this).closeWifi(); + } + + + initHotSpot(); + } + + private void initHotSpot() { + + mWifiAPBroadcastReceiver = new WifiAPBroadcastReceiver() { + + @Override + public void onWifiApEnabled() { + if(!mIsInitialized){ + Utils.log("===初始化热点成功"); + AppController.MAIN_EXECUTOR.execute(checkHotSpot()); + mIsInitialized = true; + mHotSpotName.setText(mySsid); + } + + } + }; + + IntentFilter filter = new IntentFilter(WifiAPBroadcastReceiver.ACTION_WIFI_AP_STATE_CHANGED); + registerReceiver(mWifiAPBroadcastReceiver, filter); + + HotspotManager.isApOn(this); + + mySsid = "GHZS-"; + int[] randomArray = RandomUtils.getRandomArray(4, 10); + for (int i : randomArray) { + mySsid = mySsid + i; + } + + HotspotManager.configApState(this, mySsid); // change Ap state :boolean + } + + private Runnable checkHotSpot() { + return new Runnable() { + @Override + public void run() { + try{ + // 确保热点开启之后获取得到IP地址 + String hotspotIpAddr = WifiMgr.getInstance(ShareGhWfifActivity.this).getHotspotLocalIpAddress(); + int count = 0; + while(hotspotIpAddr.equals(Constant.DEFAULT_UNKOWN_IP) && count < Constant.DEFAULT_TRY_TIME){ + Thread.sleep(1000); + hotspotIpAddr = WifiMgr.getInstance(ShareGhWfifActivity.this).getIpAddressFromHotspot(); + count ++; + } + + // 即使热点wifi的IP地址也是无法连接网络 所以采取此策略 + count = 0; + while(!WifiUtils.pingIpAddress(hotspotIpAddr) && count < Constant.DEFAULT_TRY_TIME){ + Thread.sleep(500); + count ++; + } + } catch(Exception e) { + Utils.log("==热点启动异常::" + e.toString()); + } + + Utils.log("===热点可用"); + + initMicroServer(); + } + }; + } + + private void initMicroServer() { + new Thread(new Runnable() { + @Override + public void run() { + try { + Utils.log("===准备开启微型服务器"); + if (mServerSocket == null) { + mServerSocket = new ServerSocket(); + mServerSocket.setReuseAddress(true); + mServerSocket.bind(new InetSocketAddress(Constant.DEFAULT_MICRO_SERVER_PORT)); + } + + while (!isColseActivity) { + Utils.log("===循环等待客户端请求"); + Socket socket = mServerSocket.accept(); + KcWebRequestEntity requestEntity = hanlderSocket(socket); + for (KcUriHandler uriHandler : mUriHandlers) { + if (!uriHandler.matches(requestEntity.getUri())) { + continue; + } + + Utils.log("====请求处理::" + requestEntity.getUri() + "==" + uriHandler.getClass().toString()); + uriHandler.handler(requestEntity); + } + + } + + } catch (IOException e) { + Utils.log("===网页传下载出现异常" + e.toString()); + e.printStackTrace(); + } + } + }).start(); + } + + private KcWebRequestEntity hanlderSocket(Socket socket) { + KcWebRequestEntity requestEntity = new KcWebRequestEntity(); + + requestEntity.setSocket(socket); + + try { + InputStream is = socket.getInputStream(); + StringBuilder sb = new StringBuilder(); + int a = 0, b = 0; + while((b != -1) && !(a == '\r' && b == '\n')){ + a = b; + b = is.read(); + sb.append((char)(b)); + } + String[] split = sb.toString().split(" "); + if (split.length > 1) { + String requestUri = split[1]; + requestEntity.setUri(requestUri); + Utils.log("===客户端请求链接::" + requestUri); + } else { + requestEntity.setUri("/ERROR"); + Utils.log("===客户端请求链接异常::" + sb.toString()); + } + } catch (IOException e) { + e.printStackTrace(); + } + return requestEntity; + } + + @Override + public void onBackPressed() { + backActivity(); + } + + @OnClick(R.id.actionbar_rl_back) + public void OnBackClikListener() { + backActivity(); + } + + private void backActivity() { + DialogUtils.showWarningDialog(this, "退出传送", "退出会中断所有游戏的传送,确定要退出吗?" + , "取消", "确定" + , new DialogUtils.ConfiremListener() { + @Override + public void onConfirem() { + isColseActivity = true; + unregisterReceiver(mWifiAPBroadcastReceiver); + try { + if(mWifiAPBroadcastReceiver != null){ + unregisterReceiver(mWifiAPBroadcastReceiver); + mWifiAPBroadcastReceiver = null; + } + } catch (Exception e) { + Utils.log("网页传发送异常-关闭广播"); + e.printStackTrace(); + } + + + for (KcUriHandler uriHandler : mUriHandlers) { + uriHandler.destroy(); + } + + if (mServerSocket != null) { + try { + mServerSocket.close(); + mServerSocket = null; + } catch (IOException e) { + e.printStackTrace(); + } + } + + HotspotManager.disableAp(ShareGhWfifActivity.this); + if (isOpenWifi) { + WifiMgr.getInstance(ShareGhWfifActivity.this).openWifi(); + } + + finish(); + } + }, null); + + } +} diff --git a/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java b/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java index 9988818933..8bf4d65649 100644 --- a/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java +++ b/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java @@ -43,6 +43,7 @@ public class WeiBoShareActivity extends Activity implements IWeiboHandler.Respon private String shareNewsTitle; // shareNewsTitle不为空就是新闻分享,否则是游戏分享 private boolean isPlugin; + private boolean ispopupWindow; private IWeiboShareAPI mWeiboShareAPI; @@ -55,6 +56,7 @@ public class WeiBoShareActivity extends Activity implements IWeiboHandler.Respon shareIcon = extras.getString("shareIcon"); shareNewsTitle = extras.getString("shareNewsTitle"); isPlugin = extras.getBoolean("isPlugin"); + ispopupWindow = extras.getBoolean("ispopupWindow"); Utils.toast(this, "分享跳转中..."); @@ -97,14 +99,18 @@ public class WeiBoShareActivity extends Activity implements IWeiboHandler.Respon Bitmap bgBitmap = ShareUtils.getInstance(getApplication()).addBackGround(bitmap); TextObject textObject = new TextObject(); - if (shareNewsTitle != null){ - textObject.text = shareNewsTitle + "@光环助手"; - }else { - if (isPlugin){ - textObject.text ="向你推荐:" + shareGameName + "(光环加速版)" + " @光环助手 "; + if (ispopupWindow) { + if (shareNewsTitle != null){ + textObject.text = shareNewsTitle + "@光环助手"; }else { - textObject.text ="向你推荐:" + shareGameName + " @光环助手 " ; + if (isPlugin){ + textObject.text ="向你推荐:" + shareGameName + "(光环加速版)" + " @光环助手 "; + }else { + textObject.text ="向你推荐:" + shareGameName + " @光环助手 " ; + } } + } else { + textObject.text = "这个App可以下载各种热门卡牌手游的加速版,绿色安全,超级省心,做日常效率提高3-5倍!不用肝的感觉真好! @光环助手"; } ImageObject imageObject = new ImageObject(); diff --git a/app/src/main/java/com/gh/gamecenter/entity/KcWebRequestEntity.java b/app/src/main/java/com/gh/gamecenter/entity/KcWebRequestEntity.java new file mode 100644 index 0000000000..195f17621e --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/entity/KcWebRequestEntity.java @@ -0,0 +1,29 @@ +package com.gh.gamecenter.entity; + +import java.net.Socket; + +/** + * Created by khy on 2017/2/6. + */ +public class KcWebRequestEntity { + + private Socket socket; + + private String uri; + + public Socket getSocket() { + return socket; + } + + public void setSocket(Socket socket) { + this.socket = socket; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/kuaichuan/Constant.java b/app/src/main/java/com/gh/gamecenter/kuaichuan/Constant.java new file mode 100644 index 0000000000..a776adf424 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/kuaichuan/Constant.java @@ -0,0 +1,69 @@ +package com.gh.gamecenter.kuaichuan; + +/** + * 常量类 + */ +public class Constant { + /** + * 写文件的请求码 + */ + public static final int REQUEST_CODE_WRITE_FILE = 200; + + /** + * 读取文件的请求码 + */ + public static final int REQUEST_CODE_READ_FILE = 201; + + /** + * ServerSocket 默认IP + */ + public static final String DEFAULT_SERVER_IP = "192.168.43.1"; + + /** + * Wifi连接上时 未分配默认的Ip地址 + */ + public static final String DEFAULT_UNKOWN_IP = "0.0.0.0"; + + /** + * 最大尝试数 + */ + public static final int DEFAULT_TRY_TIME = 10; + + /** + * 文件传输监听 默认端口 + */ + public static final int DEFAULT_SERVER_PORT = 8080; + + /** + * UDP通信服务 默认端口 + */ + public static final int DEFAULT_SERVER_COM_PORT = 8011; + + /** + * UDP通信服务 默认端口 + */ + public static final int DEFAULT_SERVER_CANCEL_PORT = 8090; + + + + + /** + * Android微型服务器 默认端口 + */ + public static final int DEFAULT_MICRO_SERVER_PORT = 3100; + + + public static final String KEY_IP_PORT_INFO = "KEY_IP_PORT_INFO"; + + + /** + * 文件发送方 与 文件接收方 通信信息 + */ + public static final String MSG_FILE_RECEIVER_INIT = "MSG_FILE_RECEIVER_INIT"; + public static final String MSG_FILE_RECEIVER_INIT_SUCCESS = "MSG_FILE_RECEIVER_INIT_SUCCESS"; + public static final String MSG_FILE_SENDER_START = "MSG_FILE_SENDER_START"; + public static final String MSG_RECEIVER_CANCEL = "MSG_RECEIVER_CANCEL"; + + +} + diff --git a/app/src/main/java/com/gh/gamecenter/kuaichuan/DownloadUriHandler.java b/app/src/main/java/com/gh/gamecenter/kuaichuan/DownloadUriHandler.java new file mode 100644 index 0000000000..5c4414659c --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/kuaichuan/DownloadUriHandler.java @@ -0,0 +1,92 @@ +package com.gh.gamecenter.kuaichuan; + +import android.app.Activity; + +import com.gh.common.util.Utils; +import com.gh.gamecenter.entity.KcWebRequestEntity; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; +import java.net.Socket; + +/** + * Created by khy on 2017/2/6. + * 快传 网页传下载文件处理 + */ +public class DownloadUriHandler implements KcUriHandler { + + public static final String DOWNLOAD_PREFIX = "/download/"; + private Activity mActivity; + + public DownloadUriHandler(Activity activity) { + this.mActivity = activity; + } + + @Override + public boolean matches(String uri) { + return uri.startsWith(DOWNLOAD_PREFIX); + } + + @Override + public void handler(KcWebRequestEntity request) { + String absolutePath = mActivity.getApplicationContext().getPackageResourcePath(); // 光环助手安装包路径 + Socket socket = request.getSocket(); + + File file = new File(absolutePath); + long fileSize = file.length(); + + OutputStream os; + PrintStream printStream = null; + try { + os = socket.getOutputStream(); + printStream = new PrintStream(os); + } catch (IOException e) { + e.printStackTrace(); + } + + + printStream.println("HTTP/1.0 200 OK"); + printStream.println("Content-Length:" + fileSize); + printStream.println("Content-Type:application/octet-stream"); + printStream.println(); + + FileInputStream fis = null; + + try { + fis = new FileInputStream(file); + + int len = 0; + byte[] bytes = new byte[2048]; + int count = 0; + + while((len = fis.read(bytes)) != -1){ + count = count + len; + printStream.write(bytes, 0, len); + } + Utils.log("====写入完成长度::" + count); + Thread.sleep(500); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if(fis != null){ + try { + fis.close(); + fis = null; + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + printStream.flush(); + printStream.close(); + } + + @Override + public void destroy() { + this.mActivity = null; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/kuaichuan/HotspotManager.java b/app/src/main/java/com/gh/gamecenter/kuaichuan/HotspotManager.java new file mode 100644 index 0000000000..04f4b261a1 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/kuaichuan/HotspotManager.java @@ -0,0 +1,82 @@ +package com.gh.gamecenter.kuaichuan; + +import android.content.Context; +import android.net.wifi.WifiConfiguration; + +import java.lang.reflect.Method; + +/** + * Created by khy on 2017/1/20. + */ +public class HotspotManager { + + //检查热点开关 + public static boolean isApOn(Context context) { + android.net.wifi.WifiManager wifimanager = (android.net.wifi.WifiManager) context.getSystemService(context.WIFI_SERVICE); + try { + Method method = wifimanager.getClass().getDeclaredMethod("isWifiApEnabled"); + method.setAccessible(true); + return (Boolean) method.invoke(wifimanager); + } + catch (Throwable ignored) { + ignored.printStackTrace(); + } + return false; + } + + //关闭WiFi热点 + public static void disableAp(Context context) { + android.net.wifi.WifiManager wifimanager = (android.net.wifi.WifiManager) context.getSystemService(context.WIFI_SERVICE); + try { + Method method = wifimanager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); + method.invoke(wifimanager, null, false); + } catch (Throwable ignored) { + ignored.printStackTrace(); + } + } + + // toggle wifi hotspot on or off + public static boolean configApState(Context context) { + android.net.wifi.WifiManager wifimanager = (android.net.wifi.WifiManager) context.getSystemService(context.WIFI_SERVICE); + WifiConfiguration wificonfiguration = null; + try { + // if WiFi is on, turn it off + if(isApOn(context)) { + wifimanager.setWifiEnabled(false); + // if ap is on and then disable ap + disableAp(context); + } + Method method = wifimanager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); + method.invoke(wifimanager, wificonfiguration, !isApOn(context)); + return true; + } + catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + + // toggle wifi hotspot on or off, and specify the hotspot name + public static boolean configApState(Context context, String apName) { + android.net.wifi.WifiManager wifimanager = (android.net.wifi.WifiManager) context.getSystemService(context.WIFI_SERVICE); + WifiConfiguration wificonfiguration = null; + try { + wificonfiguration = new WifiConfiguration(); + wificonfiguration.SSID = apName; + // if WiFi is on, turn it off + if(isApOn(context)) { + wifimanager.setWifiEnabled(false); + // if ap is on and then disable ap + disableAp(context); + } + Method method = wifimanager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); + method.invoke(wifimanager, wificonfiguration, !isApOn(context)); + return true; + } + catch (Exception e) { + e.printStackTrace(); + } + return false; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/kuaichuan/HtmlUriHandler.java b/app/src/main/java/com/gh/gamecenter/kuaichuan/HtmlUriHandler.java new file mode 100644 index 0000000000..3d06aa5ca2 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/kuaichuan/HtmlUriHandler.java @@ -0,0 +1,109 @@ +package com.gh.gamecenter.kuaichuan; + +import android.app.Activity; + +import com.gh.common.util.Utils; +import com.gh.gamecenter.entity.KcWebRequestEntity; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintStream; + +/** + * Created by khy on 2017/2/6. + * 快传 网页传加载网页 + */ +public class HtmlUriHandler implements KcUriHandler{ + private Activity mActivity; + + public HtmlUriHandler(Activity activity) { + this.mActivity = activity; + } + + @Override + public boolean matches(String uri) { + if(uri == null || uri.equals("") || uri.equals("/")){ + return true; + } + return false; + } + + @Override + public void handler(KcWebRequestEntity request) { + String homeHtml = null; + try { + InputStream is = this.mActivity.getAssets().open("Home.html"); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + int len = 0; + byte[] bytes = new byte[2048]; + + while((len = is.read(bytes)) != -1){ + baos.write(bytes, 0, len); + } + + homeHtml = baos.toString("UTF-8"); + } catch (IOException e) { + Utils.log("===加载asset HTML文件异常" + e.toString()); + e.printStackTrace(); + } + + if(request.getSocket() != null && homeHtml != null){ + OutputStream outputStream = null; + PrintStream printStream = null; + + try { + outputStream = request.getSocket().getOutputStream(); + printStream = new PrintStream(outputStream); + printStream.println("HTTP/1.0 200 OK"); + printStream.println("Content-Length:" + homeHtml.length()); + printStream.println("Content-Type:text/html"); + printStream.println("Cache-Control:no-cache"); + printStream.println("Pragma:no-cache"); + printStream.println("Expires:0"); + printStream.println(); + + + byte[] bytes = homeHtml.getBytes("UTF-8"); + printStream.write(bytes); + + Utils.log("====传输大小::" + homeHtml.length()); + } catch (IOException e) { + Utils.log("===快传网页加载异常" + e.toString()); + e.printStackTrace(); + } finally { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(outputStream != null){ + try { + outputStream.close(); + outputStream = null; + } catch (Exception e) { + e.printStackTrace(); + } + } + if(printStream != null){ + try { + printStream.flush(); + printStream.close(); + printStream = null; + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } else { + Utils.log("===HTML 或者 Socket为空" ); + } + Utils.log("===快传网页加载完成" ); + } + + @Override + public void destroy() { + mActivity = null; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/kuaichuan/ImageUriHandler.java b/app/src/main/java/com/gh/gamecenter/kuaichuan/ImageUriHandler.java new file mode 100644 index 0000000000..95a3ef6664 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/kuaichuan/ImageUriHandler.java @@ -0,0 +1,101 @@ +package com.gh.gamecenter.kuaichuan; + +import android.app.Activity; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; + +import com.gh.common.util.Utils; +import com.gh.gamecenter.R; +import com.gh.gamecenter.entity.KcWebRequestEntity; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintStream; +import java.net.Socket; + +/** + * Created by khy on 2017/2/6. + * 快传 网页传加载图片 + */ +public class ImageUriHandler implements KcUriHandler { + Activity mActivity; + public static final String IMAGE_PREFIX = "/image/"; + + public ImageUriHandler(Activity mActivity) { + this.mActivity = mActivity; + } + + @Override + public boolean matches(String uri) { + return uri.startsWith(IMAGE_PREFIX); + } + + @Override + public void handler(KcWebRequestEntity request) { + + Utils.log("====开始加载图片"); + Socket socket = request.getSocket(); + OutputStream os = null; + PrintStream printStream = null; + try { + os = socket.getOutputStream(); + printStream = new PrintStream(os); + } catch (IOException e) { + e.printStackTrace(); + } + + Bitmap bitmap = BitmapFactory.decodeResource(mActivity.getResources(), R.drawable.logo); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); + InputStream inputimage = new ByteArrayInputStream(baos.toByteArray()); + BufferedInputStream ips = new BufferedInputStream(inputimage); + + int bitmapSize = baos.toByteArray().length; + Utils.log("====开始加载图片大小::" + bitmapSize); + + printStream.println("HTTP/1.0 200 OK"); + printStream.println("Content-Length:" + bitmapSize); + printStream.println("Content-Type:multipart/mixed,text/html,image/png,image/jpeg,image/gif,image/x-xbitmap,application/vnd.oma.dd+xml,*/*"); + printStream.println(); + + try { + int len = 0; + int i = 0; + byte[] bytes = new byte[1024]; + while((len = ips.read(bytes)) != -1){ + i = i + len; + printStream.write(bytes, 0, len); + } + Utils.log("====图片传输大小::" + i ); + } catch (IOException e) { + Utils.log("====开始加载异常::" + e.toString()); + e.printStackTrace(); + }finally{ + if(ips != null){ + try { + ips.close(); + ips = null; + } catch (IOException e) { + e.printStackTrace(); + } + } + } + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + printStream.flush(); + printStream.close(); + Utils.log("====开始加载完成"); + } + + @Override + public void destroy() { + mActivity = null; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/kuaichuan/KcUriHandler.java b/app/src/main/java/com/gh/gamecenter/kuaichuan/KcUriHandler.java new file mode 100644 index 0000000000..a2cbeba332 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/kuaichuan/KcUriHandler.java @@ -0,0 +1,27 @@ +package com.gh.gamecenter.kuaichuan; + +import com.gh.gamecenter.entity.KcWebRequestEntity; + +/** + * Created by khy on 2017/2/6. + */ +public interface KcUriHandler { + + /** + * 匹配Uri 判断返回请求结果 + * @param uri + * @return + */ + boolean matches(String uri); + + /** + * 请求链接和Socket对象 + * @param request + */ + void handler(KcWebRequestEntity request); + + /** + * 销毁 + */ + void destroy(); +} diff --git a/app/src/main/java/com/gh/gamecenter/kuaichuan/WifiMgr.java b/app/src/main/java/com/gh/gamecenter/kuaichuan/WifiMgr.java new file mode 100644 index 0000000000..2930cd34f3 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/kuaichuan/WifiMgr.java @@ -0,0 +1,247 @@ +package com.gh.gamecenter.kuaichuan; + +import android.content.Context; +import android.net.DhcpInfo; +import android.net.wifi.ScanResult; +import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiInfo; + +import java.util.List; + +public class WifiMgr { + + /** + * 创建WifiConfiguration的类型 + */ + public static final int WIFICIPHER_NOPASS = 1; + public static final int WIFICIPHER_WEP = 2; + public static final int WIFICIPHER_WPA = 3; + + + private static WifiMgr mWifiMgr; + private Context mContext; + private android.net.wifi.WifiManager mWifiManager; + + //scan the result + List mScanResultList; + List mWifiConfigurations; + + + //current wifi configuration info + WifiInfo mWifiInfo; + + private WifiMgr(Context context){ + this.mContext = context; + this.mWifiManager = (android.net.wifi.WifiManager) context.getSystemService(Context.WIFI_SERVICE); + } + + public static WifiMgr getInstance(Context context){ + if(mWifiMgr == null){ + synchronized (WifiMgr.class){ + if(mWifiMgr == null){ + mWifiMgr = new WifiMgr(context); + } + } + } + + return mWifiMgr; + } + + /** + * 打开wifi + */ + public void openWifi(){ + if(!mWifiManager.isWifiEnabled()){ + mWifiManager.setWifiEnabled(true); + } + } + + + /** + * 关闭wifi + */ + public void closeWifi(){ + if(mWifiManager.isWifiEnabled()){ + mWifiManager.setWifiEnabled(false); + } + } + + + /** + * 判断wifi是否开启的状态 + * @return + */ + public boolean isWifiEnable(){ + return mWifiManager == null ? false : mWifiManager.isWifiEnabled(); + } + + + /** + * wifi扫描 + */ + public void startScan(){ + mWifiManager.startScan(); + mScanResultList = mWifiManager.getScanResults(); + mWifiConfigurations = mWifiManager.getConfiguredNetworks(); + } + + public List getScanResultList() { + return mScanResultList; + } + + public List getWifiConfigurations() { + return mWifiConfigurations; + } + + + /** + * 添加到指定Wifi网络 /切换到指定Wifi网络 + * @param wf + * @return + */ + public boolean addNetwork(WifiConfiguration wf){ + //断开当前的连接 + disconnectCurrentNetwork(); + + //连接新的连接 + int netId = mWifiManager.addNetwork(wf); + boolean enable = mWifiManager.enableNetwork(netId, true); + return enable; + } + + /** + * 关闭当前的Wifi网络 + * @return + */ + public boolean disconnectCurrentNetwork(){ + if(mWifiManager != null && mWifiManager.isWifiEnabled()){ + int netId = mWifiManager.getConnectionInfo().getNetworkId(); + mWifiManager.disableNetwork(netId); + return mWifiManager.disconnect(); + } + return false; + } + + /** + * 创建WifiConfiguration + * + * @param ssid + * @param password + * @param type + * @return + */ + public static WifiConfiguration createWifiCfg(String ssid, String password, int type){ + WifiConfiguration config = new WifiConfiguration(); + config.allowedAuthAlgorithms.clear(); + config.allowedGroupCiphers.clear(); + config.allowedKeyManagement.clear(); + config.allowedPairwiseCiphers.clear(); + config.allowedProtocols.clear(); + + config.SSID = "\"" + ssid + "\""; + + if(type == WIFICIPHER_NOPASS){ +// config.wepKeys[0] = ""; + config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); +// config.wepTxKeyIndex = 0; + +// 无密码连接WIFI时,连接不上wifi,需要注释两行代码 +// config.wepKeys[0] = ""; +// config.wepTxKeyIndex = 0; + }else if(type == WIFICIPHER_WEP){ + config.hiddenSSID = true; + config.wepKeys[0]= "\""+password+"\""; + config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); + config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); + config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); + config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); + config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); + config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); + config.wepTxKeyIndex = 0; + }else if(type == WIFICIPHER_WPA){ + config.preSharedKey = "\""+password+"\""; + config.hiddenSSID = true; + config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); + config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); + config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); + config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); + config.allowedProtocols.set(WifiConfiguration.Protocol.WPA); + config.status = WifiConfiguration.Status.ENABLED; + } + + return config; + } + + + /** + * 获取当前WifiInfo + * @return + */ + public WifiInfo getWifiInfo(){ + mWifiInfo = mWifiManager.getConnectionInfo(); + return mWifiInfo; + } + + /** + * 获取当前Wifi所分配的Ip地址 + * @return + */ +// when connect the hotspot, is still returning "0.0.0.0". + public String getCurrentIpAddress(){ + String ipAddress = ""; + int address= mWifiManager.getDhcpInfo().ipAddress; + ipAddress = ((address & 0xFF) + + "." + ((address >> 8) & 0xFF) + + "." + ((address >> 16) & 0xFF) + + "." + ((address >> 24) & 0xFF)); + return ipAddress; + } + + + /** + * 设备连接Wifi之后, 设备获取Wifi热点的IP地址 + * @return + */ + public String getIpAddressFromHotspot(){ + // WifiAP ip address is hardcoded in Android. + /* IP/netmask: 192.168.43.1/255.255.255.0 */ + String ipAddress = "192.168.43.1"; + DhcpInfo dhcpInfo = mWifiManager.getDhcpInfo(); + int address = dhcpInfo.gateway; + ipAddress = ((address & 0xFF) + + "." + ((address >> 8) & 0xFF) + + "." + ((address >> 16) & 0xFF) + + "." + ((address >> 24) & 0xFF)); + return ipAddress; + } + + + /** + * 开启热点之后,获取自身热点的IP地址 + * @return + */ + public String getHotspotLocalIpAddress(){ + // WifiAP ip address is hardcoded in Android. + /* IP/netmask: 192.168.43.1/255.255.255.0 */ + String ipAddress = "192.168.43.1"; + DhcpInfo dhcpInfo = mWifiManager.getDhcpInfo(); + int address = dhcpInfo.serverAddress; + ipAddress = ((address & 0xFF) + + "." + ((address >> 8) & 0xFF) + + "." + ((address >> 16) & 0xFF) + + "." + ((address >> 24) & 0xFF)); + return ipAddress; + } + + + + /** + * 关闭Wifi + */ + public void disableWifi(){ + if(mWifiManager != null){ + mWifiManager.setWifiEnabled(false); + } + } + +} diff --git a/app/src/main/java/com/gh/gamecenter/kuaichuan/WifiUtils.java b/app/src/main/java/com/gh/gamecenter/kuaichuan/WifiUtils.java new file mode 100644 index 0000000000..ed4ddc474d --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/kuaichuan/WifiUtils.java @@ -0,0 +1,125 @@ +package com.gh.gamecenter.kuaichuan; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.PixelFormat; +import android.graphics.drawable.Drawable; +import android.net.wifi.ScanResult; +import android.text.TextUtils; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by khy on 2017/1/17. + */ +public class WifiUtils { + + public static final String NO_PASSWORD = "[ESS]"; + public static final String NO_PASSWORD_WPS = "[WPS][ESS]"; + + /** + * 过滤有密码的Wifi扫描结果集合 和WIFI名称为空 不包含GHZS + * @param scanResultList + * @return + */ + public static List filterWithNoPassword(List scanResultList){ + if(scanResultList == null || scanResultList.size() == 0){ + return scanResultList; + } + + List resultList = new ArrayList<>(); + for(ScanResult scanResult : scanResultList){ + if(!TextUtils.isEmpty(scanResult.SSID) && scanResult.capabilities != null && + scanResult.capabilities.equals(NO_PASSWORD) || scanResult.capabilities != null && + scanResult.capabilities.equals(NO_PASSWORD_WPS)){ + if (scanResult.SSID.contains("GHZS")) { + resultList.add(scanResult); + } + } + } + + return resultList; + } + + /** + * 判断指定的ipAddress是否可以ping + * @param ipAddress + * @return + */ + public static boolean pingIpAddress(String ipAddress) { + try { + Process process = Runtime.getRuntime().exec("/system/bin/ping -c 1 -w 100 " + ipAddress); + int status = process.waitFor(); + if (status == 0) { + return true; + } else { + return false; + } + } catch (IOException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return false; + } + + /** + * 获取Apk文件的Log图标 + * @param context + * @param apk_path + * @return + */ + public static Drawable getApkThumbnail(Context context, String apk_path){ + if(context == null){ + return null; + } + + PackageManager pm = context.getPackageManager(); + PackageInfo packageInfo = pm.getPackageArchiveInfo(apk_path, PackageManager.GET_ACTIVITIES); + ApplicationInfo appInfo = packageInfo.applicationInfo; + /**获取apk的图标 */ + appInfo.sourceDir = apk_path; + appInfo.publicSourceDir = apk_path; + if(appInfo != null){ + Drawable apk_icon = appInfo.loadIcon(pm); + return apk_icon; + } + + return null; + } + + /** + * Drawable转Bitmap + * + * @param drawable + * @return + */ + public static Bitmap drawableToBitmap(Drawable drawable){ + if(drawable == null){ + return null; + } + + // 取 drawable 的长宽 + int w = drawable.getIntrinsicWidth(); + int h = drawable.getIntrinsicHeight(); + // 取 drawable 的颜色格式 + Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 + : Bitmap.Config.RGB_565; + //建立对应的Bitmap + Bitmap bitmap = Bitmap.createBitmap(w, h, config); + // 建立对应 bitmap 的画布 + Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, w, h); + // 把 drawable 内容画到画布中 + drawable.draw(canvas); + + return bitmap; + } + +} diff --git a/app/src/main/java/com/gh/gamecenter/receiver/WifiAPBroadcastReceiver.java b/app/src/main/java/com/gh/gamecenter/receiver/WifiAPBroadcastReceiver.java new file mode 100644 index 0000000000..8b213ca01c --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/receiver/WifiAPBroadcastReceiver.java @@ -0,0 +1,44 @@ +package com.gh.gamecenter.receiver; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.net.wifi.WifiManager; +import android.util.Log; + +/** + * Wifi AP BroadReciver + * wifi 热点 广播 + * + */ +public abstract class WifiAPBroadcastReceiver extends BroadcastReceiver { + + public static final String TAG = WifiAPBroadcastReceiver.class.getSimpleName(); + public static final String ACTION_WIFI_AP_STATE_CHANGED = "android.net.wifi.WIFI_AP_STATE_CHANGED"; + + + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if(action.equals(ACTION_WIFI_AP_STATE_CHANGED)){ //Wifi AP state changed + // get Wi-Fi Hotspot state here + int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0); + Log.i(TAG, "Wifi Ap state--->>>" + state); + if (WifiManager.WIFI_STATE_ENABLED == state % 10) { + // Wifi is enabled + onWifiApEnabled(); + }else if(WifiManager.WIFI_STATE_ENABLING == state % 10){ + // Wifi is enabling + }else if(WifiManager.WIFI_STATE_DISABLED == state % 10){ + // Wifi is disable + }else if(WifiManager.WIFI_STATE_DISABLING == state % 10){ + // Wifi is disabling + } + } + } + + /** + * 热点可用 + */ + public abstract void onWifiApEnabled(); +} diff --git a/app/src/main/res/drawable-hdpi/share_email_logo.png b/app/src/main/res/drawable-hdpi/share_email_logo.png new file mode 100644 index 0000000000..f26ccdd724 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/share_email_logo.png differ diff --git a/app/src/main/res/drawable-hdpi/wifi_icon.png b/app/src/main/res/drawable-hdpi/wifi_icon.png new file mode 100644 index 0000000000..01fef20f83 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/wifi_icon.png differ diff --git a/app/src/main/res/drawable-xhdpi/blue_title_bg.9.png b/app/src/main/res/drawable-xhdpi/blue_title_bg.9.png new file mode 100644 index 0000000000..ddec5c4477 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/blue_title_bg.9.png differ diff --git a/app/src/main/res/drawable-xhdpi/gray_title_bg.9.png b/app/src/main/res/drawable-xhdpi/gray_title_bg.9.png new file mode 100644 index 0000000000..afb20c36d4 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/gray_title_bg.9.png differ diff --git a/app/src/main/res/drawable/oval_hint_white_bg.xml b/app/src/main/res/drawable/oval_hint_white_bg.xml new file mode 100644 index 0000000000..35cf4ec303 --- /dev/null +++ b/app/src/main/res/drawable/oval_hint_white_bg.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_share_gh.xml b/app/src/main/res/layout/activity_share_gh.xml new file mode 100644 index 0000000000..879ea8dfb4 --- /dev/null +++ b/app/src/main/res/layout/activity_share_gh.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + +