2017年8月23日 星期三

0823 cocos2d-x 手機連線 相關資料

http://qiankanglai.me/2014/12/02/cocos2dx-assetsmanager/
基於cocos2d-x 3.x版本修改的Assets Manager,加幾行代碼就能實現斷線續傳功能…so easy



bool AssetsManager::downLoad()
{
// Create a file to save package.
const string outFileName = _storagePath + TEMP_PACKAGE_FILE_NAME;
- FILE *fp = fopen(outFileName.c_str(), "wb");
+ ssize_t outFileLength = 0;
+ FILE *fp = fopen(outFileName.c_str(), "rb");
+ if(fp)
+ {
+ fseek(fp, 0, SEEK_END);
+ outFileLength = ftell(fp);
+ fclose(fp);
+ }
+
+ fp = fopen(outFileName.c_str(), "ab");

然後在下面設置curl的地方




curl_easy_setopt(_curl, CURLOPT_FOLLOWLOCATION, 1 );
+ if(outFileLength > 0)
+ curl_easy_setopt(_curl, CURLOPT_RESUME_FROM, outFileLength);
res = curl_easy_perform(_curl);

Android – 判斷手機是否連上網路 (ConnectivityManager)

通常手機在開發網路的應用程式時, 常會定時的去取資料回來 但…倘若目前手機無法對外連線, 則這段動作就會造成手機效能無謂的耗損、與電力的浪費 所以在開發網路型的應用程式時, 首先要做的第一個功課, 便是 「判斷手機目前是否已連線"
而 Android 系統的手機, 目前是否連上網路? 以什麼方式連上網路? (WIFI / 3G…)? 目前網路是否故障中(Failover)? 目前手機是否在漫遊中(Roaming)? 這些相關的資訊, 都存在於 ConnectivityManager 這個類別當中 而使用的方式只需要去向系統取回這個服務即可
1
2
ConnectivityManager CM = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = CM.getActiveNetworkInfo();
而當中要注意到的地方, 是在 NetworkInfo 這段, 倘若你的手機目前不在網路的服務範圍, 也就是說沒有任何方式可以連出去網路 則 CM.getActiveNetworkInfo() 取回的 Reference 會是 Null, 忘了做此判斷的話, 手機則會立刻罷工給你看 (NullPointerException) 而比較常見需要取得的資料如下:
1
2
3
4
5
6
7
info.getTypeName();     // 目前以何種方式連線 [WIFI]
info.getState();        // 目前連線狀態 [CONNECTED]
info.isAvailable();     // 目前網路是否可使用 [true]
info.isConnected();     // 網路是否已連接 [true]
info.isConnectedOrConnecting(); // 網路是否已連接 或 連線中 [true]
info.isFailover();      // 網路目前是否有問題 [false]
info.isRoaming();       // 網路目前是否在漫遊中 [false]
除此之外, 也必需替應用程式設定權限, 不然手機一樣會罷工給你看 (SecurityException) 設定權限的方式則是在 AndroidManifest.xml 裡頭新增底下的權限
1
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

2017年8月18日 星期五

0818 cocos2d-x 如何取得手機型號跟其他資訊(android)

//範例程式碼
proj.android-studio\app\src\org\cocos2dx\cpp\AppActivity.java

增加
import android.os.Build;   // 主機版名稱 String board = Build.BOARD;
public class AppActivity extends Cocos2dxActivity {    
    private static String deviceInfo; //回傳手機型號跟系統版本
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        deviceInfo = this.getDeviceInfo();
    }  
        public static String findDeviceInfo() {
        return deviceInfo;
    }
    /**
     * Get Android node and Android version
     * */
    public String getDeviceInfo()
    {
        TelephonyManager manager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
  String model = Build.MODEL; //手機型號
String phoneNum = manager.getLine1Number();//本機電話號碼
String sdkVersion = Build.VERSION.SDK;//SDK版本號
String osVersion = Build.VERSION.RELEASE;//Firmware/OS 版本號
return "Phone:" +model + "  OS:" + osVersion;

    }
   
     
}

///參考文章
http://www.cocos2dev.com/?p=208

今天要獲取用戶反饋意見,我默認將用戶的手機號碼上傳了,結果發現並不是所有的手機能拿到本機號碼。找了下發現原是用戶的SIM卡沒有寫入本機號碼導致的。
Android獲取本機號碼:
TelephonyManager phoneMgr = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
String phoneNum = phoneMgr.getLine1Number(); 
AndroidManifest.xml中添加權限:
<uses-permission android:name=」android.permission.READ_PHONE_STATE」 />
剛才也說了,手機號碼不是所有的都能獲取。只是有一部分可以拿到。這個是由於移動運營商沒有把手機號碼的數據寫入到sim卡中。
手機型號 Build.MODEL
String MODEL The end-user-visible name for the end product.
sdk版本 Build.VERSION.SDK
String SDK This constant is deprecated. Use SDK_INT to easily get this as an integer.
frimware版本號(系統版本號) Build.VERSION.RELEASE
String RELEASE The user-visible version string.
獲取手機的其他信息:
private void getPhoneStatus(){
TelephonyManager phoneMgr=(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);      
String model = Build.MODEL; //手機型號
String phoneNum = phoneMgr.getLine1Number();//本機電話號碼
String sdkVersion = Build.VERSION.SDK;//SDK版本號
String osVersion = Build.VERSION.RELEASE;//Firmware/OS 版本號
}
Build中包括 硬件廠商,硬件編號,序列號等很多信息。調用方法也很簡單,和上面類似的。
下面是Google提供的參考表:
StringBOARDThe name of the underlying board, like 「goldfish」.
StringBOOTLOADERThe system bootloader version number.
StringBRANDThe brand (e.g., carrier) the software is customized for, if any.
StringCPU_ABIThe name of the instruction set (CPU type + ABI convention) of native code.
StringCPU_ABI2The name of the second instruction set (CPU type + ABI convention) of native code.
StringDEVICEThe name of the industrial design.
StringDISPLAYA build ID string meant for displaying to the user
StringFINGERPRINTA string that uniquely identifies this build.
StringHARDWAREThe name of the hardware (from the kernel command line or /proc).
StringHOST
StringIDEither a changelist number, or a label like 「M4-rc20」.
StringMANUFACTURERThe manufacturer of the product/hardware.
StringMODELThe end-user-visible name for the end product.
StringPRODUCTThe name of the overall product.
StringRADIOThe radio firmware version number.
StringSERIALA hardware serial number, if available.
StringTAGSComma-separated tags describing the build, like 「unsigned,debug」.
longTIME
StringTYPEThe type of build, like 「user」 or 「eng」.
StringUNKNOWNValue used for when a build property is unknown.
StringUSER

2017年8月16日 星期三

0816 cocos2d-x 開啟網址

http://jslim.net/blog/2014/09/24/cocos2d-x-v3-open-url/
You can invoke Application::getInstance()->openURL("your url"). e.g.
MyScene.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
switch (Application::getInstance()->getTargetPlatform()) {
case Application::Platform::OS_IPAD:
case Application::Platform::OS_IPHONE:
Application::getInstance()->openURL("http://www.apple.com");
break;
case Application::Platform::OS_ANDROID:
Application::getInstance()->openURL("http://www.google.com");
break;
default:
break;
}

cocos2dx-lua 建立滑鼠監聽

重要關鍵字  EVENT_MOUSE_SCROLL addEventListenerWithSceneGraphPriority      if IsPc() then --建立滑鼠監聽         local listener = cc.EventListenerMouse...