#스하리1000명프로젝트, في بعض الأحيان يكون من الصعب التحدث مع العمال الأجانب، أليس كذلك؟ لقد صنعت تطبيقًا بسيطًا يساعد! أنت تكتب بلغتك، والآخرون يرون ذلك بلغتهم. يترجم تلقائيًا بناءً على الإعدادات. مفيد للغاية لإجراء محادثات سهلة. ألق نظرة عندما تحصل على فرصة! https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416
#billcorea #운동동아리관리앱 🏸 شنيدل، تطبيق ضروري لأندية كرة الريشة! 👉 مباراة اللعب - سجل النتائج وابحث عن المعارضين 🎉 مثالي لأي مكان، بمفردك، مع الأصدقاء، أو في النادي! 🤝 إذا كنت تحب كرة الريشة، جربها بالتأكيد
اذهب إلى التطبيق 👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay
사실은 잘 모르겠는데, 2번 방식으로 안드로이드에서 구현이 될까는 고민을 해 봐야 할 것 같다. 그래서 1번을 해 보기로 했는데,
문제가 또 있다. java script 방식으로 처리를 해야 하기 때문에 실시간으로 활용할 수 있는 서버가 있어야 한다는 것이다. 검색을 통해서 얻은 결론은 호스팅 서비스를 사용하거나 하는 방법이 필요하다는 것인데, 저렴하게(?) 사용을 해 보려 하니, 방법이 좀 어렵다.
function onReceivedPostMessage(event){ //..ex deconstruct event into action & params var action = event.data.action; var params = event.data.params;
console.log("onReceivedPostMessage "+event);
}
function onReceivedActivityMessageViaJavascriptInterface(json){ //..ex deconstruct data into action & params var data = JSON.parse(json); var action = data.action; var params = data.params; console.log("onReceivedActivityMessageViaJavascriptInterface "+event); }
// 우편번호 찾기 화면을 넣을 element var element_layer = document.getElementById('layer');
function sample2_execDaumPostcode() { new daum.Postcode({ oncomplete: function(data) {
// 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.
// 각 주소의 노출 규칙에 따라 주소를 조합한다. // 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다. var fullAddr = data.address; // 최종 주소 변수 var extraAddr = ''; // 조합형 주소 변수
// 기본 주소가 도로명 타입일때 조합한다. if(data.addressType === 'R'){ //법정동명이 있을 경우 추가한다. if(data.bname !== ''){ extraAddr += data.bname; } // 건물명이 있을 경우 추가한다. if(data.buildingName !== ''){ extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName); } // 조합형주소의 유무에 따라 양쪽에 괄호를 추가하여 최종 주소를 만든다. fullAddr += (extraAddr !== '' ? ' ('+ extraAddr +')' : ''); }
var fullRoadAddr = data.roadAddress; // 도로명 주소 변수 var extraRoadAddr = ''; // 도로명 조합형 주소 변수
// 법정동명이 있을 경우 추가한다. (법정리는 제외) // 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다. if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){ extraRoadAddr += data.bname; }
// iframe을 넣은 element를 보이게 한다. element_layer.style.display = 'block';
// iframe을 넣은 element의 위치를 화면의 가운데로 이동시킨다. initLayerPosition();
}
// 브라우저의 크기 변경에 따라 레이어를 가운데로 이동시키고자 하실때에는 // resize이벤트나, orientationchange이벤트를 이용하여 값이 변경될때마다 아래 함수를 실행 시켜 주시거나, // 직접 element_layer의 top,left값을 수정해 주시면 됩니다. function initLayerPosition(){ var width = (window.innerWidth || document.documentElement.clientWidth); //우편번호서비스가 들어갈 element의 width var height = (window.innerHeight || document.documentElement.clientHeight); //우편번호서비스가 들어갈 element의 height var borderWidth = 5; //샘플에서 사용하는 border의 두께
// 위에서 선언한 값들을 실제 element에 넣는다. element_layer.style.width = width + 'px'; element_layer.style.height = height + 'px'; element_layer.style.border = borderWidth + 'px solid'; // 실행되는 순간의 화면 너비와 높이 값을 가져와서 중앙에 뜰 수 있도록 위치를 계산한다. element_layer.style.left = (((window.innerWidth || document.documentElement.clientWidth) - width)/2 - borderWidth) + 'px'; element_layer.style.top = (((window.innerHeight || document.documentElement.clientHeight) - height)/2 - borderWidth) + 'px'; }
class AddressApiActivity : AppCompatActivity() { private var webView: WebView? = null var TAG = "AddressApiActivity"; lateinit var activityAddressApiBinding : ActivityAddressApiBinding
inner class MyJavaScriptInterface { @JavascriptInterface fun processDATA(data: String?) { // 주소검색창에서 주소를 선택하면 그 결과값이 data 에 들어오기 떄문에 그것을 // 받아서 내가 만드는 앱 페이지로 넘기면 끝. val intent = Intent() intent.putExtra("data", data) setResult(RESULT_OK, intent) finish() } }
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)
// 위에서 작성한 블로거 페이지의 url val blogspot = "https://billcoreatech.blogspot.com/2022/06/blog-post.html"
activityAddressApiBinding = ActivityAddressApiBinding.inflate(layoutInflater) setContentView(activityAddressApiBinding.root) activityAddressApiBinding.webView!!.settings.javaScriptEnabled = true activityAddressApiBinding.webView!!.addJavascriptInterface(MyJavaScriptInterface(), "Android") activityAddressApiBinding.webView!!.webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView, url: String) { // 위 웹페이지가 load가 끝나면 코드에서 작성했던 script 을 호출한다. view.loadUrl("javascript:sample2_execDaumPostcode();") } } // 위 블로거 페이지를 호출 한다. activityAddressApiBinding.webView!!.loadUrl(blogspot) } }
#스하리1000명프로젝트, Nawala sa Korea? Kahit na hindi ka nagsasalita ng Korean, tinutulungan ka ng app na ito na madaling makalibot. Sabihin lang ang iyong wika—ito ay nagsasalin, naghahanap, at nagpapakita ng mga resulta pabalik sa iyong wika. Mahusay para sa mga manlalakbay! Sinusuportahan ang 10+ wika kabilang ang English, Japanese, Chinese, Vietnamese, at higit pa. Subukan ito ngayon! https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127
유달산 올랐다. 걸어서 ? 목포 해양 케이블카 북항 승강장에서 고하도 가는 왕복을 끊었다. 고하도 가는 길에 유달산에서 내릴 수 있다니 ? 일단은 고하도를 갔다. 그곳에서 해변을 낀 데크가 길게 뻗어 있기는 했지만, 난 유달산을 올라 보기로 했다. 바로 돌아오는 케이블카를 타고, 유달산에서 내렸다. 중턱에서 내려서 인지 일등봉에 올리는 데 그리 오래 걸리지 않았다. 쭈욱 올라 돌아보니 뻥 뚤린 바다가 이쁘다.
다시 내려와 길을 나섰다. 오후에는 낚시를 해서 한마리 잡아 보리라... 톱머리 해수육장 근처 선착장에서 낚시를 해 보기로 했다. 오늘도 어복은 없는 지 한 번의 입질이 없다. 오늘 여전히 시간을 낚았다. 다음엔 기회가 있을 까 ?