發表文章

目前顯示的是有「APP」標籤的文章

android X 是什麼

圖片
AndroidX 出現一陣子,隨著android版本的更新,看來 GOOGLE 未來是鐵了心要強迫大家用androidX了。到底android X是什麼。 android 開始的時期,是微軟稱霸的時期,所有作業系統都很難有一片天地。在APPLE手機出現之前,智慧手機還是一片安裝微軟系統的陽春機。我們說他陽春是因為軟體的開發者並沒有想象或是去感受一個可攜裝置的未來與使用方式。所以做出來的手機難用至極。這也導致了APPLE IPHONE一出現就席卷了整個世界。我還記得朋友拿iphone3在我面前擺弄的樣子,就像一個小孩發現了好玩的玩具一樣。 此時的google看到了手機市場,也推出了以android為作業系統的手機,這個時期最悲悽的就是NOKIA了。沒有跟上這個潮流,一下子就從天上跌到了海溝裡。在重力加速度的加持下,速度之快,直接深埋在海溝之中。 此時的android也沒有想過,智慧手機的進展會如何。還一堆人在討論,五吋手機太大了,未來一定還會縮小。也一堆人在討論,手機只會越來越大。今天看來,沒有想象力的人們,能討論的只是當下的問題。今天還有人在討論手機未來大小如何嗎?現在討論的是要如何人性化,更好用,更省電,更好一手掌控。 自然在android 3 的時候,為了平版,android加入了fragment功能,讓介面的排列可以更多樣,但是,新的功能如何跟舊的系統相容呢?這就是support library出現的原因了。從這裡每次寫程式都要考慮是要用 android.support.V4.app還是 android.support.V7.appcompat。 物換星移,漸漸的 android1, android2漸漸的看不到市佔了,但舊有的support V4 V7庫裡面還是有往下相容的物件與命名空間。所以也是到了要好好大掃除一下了。因此google 就推出了android X,把所有的物件跟命名空間都重整一下,這樣以後也不用再用V4、V7 這些命名。 主要改變 一 、原本android.support.*,都改成 androidx.* 二、appcompat-v7庫之類都改成appcompat即可,不用帶版號。 如何做出改變 一、目前新版android studio 3.4.2 ,打從新建一個計畫,就直接勾選了使用androidX。所以不用煩腦這個問題。 二、舊程式可以

android 版本控制

隨著android來到 10 版。天啊!不知不覺。已過了那麼多年。為了顧及過去舊版本的朋友。我們在程式中就要因為版本而產生不同的程式碼。 以下是 if (Build.VERSION. SDK_INT >= Build.VERSION_CODES. M ) { //大於等於 M 版本要做的事           } else if (Build.VERSION. SDK_INT >= Build.VERSION_CODES. KITKAT ) { //大於等於 KITKAT 要做的事 } else { // 其它版本 } 在一些特別的功能上,不時會用到。先留下紀錄以備不時之需。

得到 關於手機 的訊息

圖片
import android.os.Build ;   Build中可以取得手機中的一些資訊如下 主機版名稱 = Build . BOARD ; 硬體名稱 = Build.HARDWARE;   品牌名稱 = Build . BRAND ;   CPU名稱 = Build . CPU_ABI ;   設備名稱 = Build . DEVICE ;   版本號碼 = Build . DISPLAY ;   設備識別碼 = Build . FINGERPRINT ;   HOST = Build . HOST ;   版本號碼 = Build . ID ;   製造商 = Build . MANUFACTURER ;   模組號碼 = Build . MODEL ;   產品名稱 = Build . PRODUCT ;   設備描述 = Build . TAGS ;   設備類別 = Build . TYPE ;   USER = Build . USER ; 結果

9-Patch files 創建可調整的圖

圖片
如何製作9-Patch的圖檔。DEVELOPER中提供了很方便的做法。 1.先將要製作的圖檔COPY到drawable ,此例中為 123.png。然後開啟 Android Studio。(這裡小記一下,取名為123.png是不可取的。檔名需有英文字母。)點擊右鍵後,選Create 9-Patch file。  2.出現尋問要將9-Patch檔存在哪裡。我們還是選drawable中。 3.我們會發現 drawable中已產生一個 123.9.png 檔。雙擊123.9.png。出現下圖。  4.現在是最重點的地方。拉動上下左右邊界,圖下拉完邊界,中間垂直與水平灰色區交疊區就是我們內容會放置的地方,也就是會拉伸的地方。這樣四個角落的圓弧就不會因為內容過多而變形。 5.存檔,原本的123.png可以移除。程式中使用圖檔時,只需用到檔名 123,後面的.9可以不加。

Screen Size 螢幕尺寸 與 文字大小

        DisplayMetrics dm=new DisplayMetrics();         getWindowManager().getDefaultDisplay().getMetrics(dm);         displayWidth=dm.widthPixels;         displayHeight=dm.heightPixels; 用這個方法我們可以得到螢幕的尺寸。有了螢幕的尺寸,我們就可以設定文字的大小,讓文字大小跟著螢幕尺寸改變。 int contentWordSize=11; //一列11個字。 TextView tv=findViewById(R.id.xxxx); tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, displayWidth/contentWordSize); 這樣是不是很方便!

改變 drawable 的顏色

public static Drawable tintDrawable(Drawable drawable, int color) {         Drawable wd = DrawableCompat.wrap(drawable);         DrawableCompat.setTint(wd, color);         return wd;     } 只要將使用中的drawable,用上面的方法處理,再拿來用,drawable的顏色就會改變。 這個方法可以用來處理ImageButton點擊後,ImageButton變色。方便許多。 ImageButton ibtn = findViewById( R.id.xxxx ); iBtn.setBackground(getResources().getDrawable(R .drawable.xxxx )); ibtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ibtn.setBackground(tintDrawable(getResources().getDrawable( R.drawable.xxxx ) .mutate() , Color.Green )); new Handler().postDelayed(new Runnable() { @Override public void run() { iBtn.setBackground(getResources().getDrawable(R .drawable.xxxx )); } }, 1000); } }); 現在ImageButton點擊後,會將原來的圖變成Color.GREEN的

PendingIntent 速記

什麼是PendingIntent,字面上來看就是 即將發生的intent。 我們知道如果要開始一個Intent,可以如下 Intent x1 = new Intent( this, xxx.class); startActivity(x1); 通常我們是要開啟一個新的activity會用到Intent。我們更應該把 Intent理解為Activity間的一個訊息的傳遞。也就是由Intent這個信使,帶著訊息,告知Activity要啟動了。這樣理解,我們可以推論,Intent可以帶著訊息通知其它class,讓他們啟動。 如 Service Intent x1 = new Intent(this, xxxService.class); startService(x1); 但有時候,我們有一個Intent,我們不想用 startActivity, 或是 startService去啟動,而是希望它等待至某種要求出現才啟動。這就需要用到 PendingIntent。 所以簡單的說,PendingIntent就是把一個已知的 Intent 包起來。然後pending(即將發生)。 我們看一下PendingIntent有幾個靜態方法 包了一個Activity的Intent public static PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags) 包了一個Broadcast的Intent public static PendingIntent getBroadcast(Context context, int requestCode, Intent intent, int flags) 包了一個Service的Intent public static PendingIntent getService(Context context, int requestCode, Intent intent, int flags) 包了多個Activity的Intent public static PendingIntent getActivities(Context context, int requestCode,

Android AudioTrack AudioRecord II

上一篇寫一半,我們把他完善了,針對AudioRecord的部份 new Thread(new Runnable() {   @Override   public void run() {     int recBuffSize=AudioRecord.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);     //recBuffSize = 4096; //如果語音斷斷續續可以調整buffer size     AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, recBuffSize);                             byte[] buffer = new byte[recBuffSize];     audioRecord.startRecording(); // 开始录音     try {       clientSocket = new DatagramSocket();     } catch (SocketException e) {       e.printStackTrace();     }     InetAddress des = null;     try {       des = InetAddress.getByName("192.168.1.XX");     } catch (UnknownHostException e) {       e.printStackTrace();     }     int port = 3333;     while (true) {       int bufferReadResult = audioRecord.read(buffer, 0, recBuffSize);       packet = new DatagramPacket(buffer,

Android AudioTrack AudioRecord

如何使用 AudioTrack,其實跟AudioRecord差不多, 我們做一個比較 新增一個AudioTrack 跟新增一個AudioRecord幾乎一樣 AudioTrack audioTrack = new AudioTrack( AudioManager.STREAM_MUSIC, SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM); 以下是AudioRecord AudioRecord record = new AudioRecord( MediaRecorder.AudioSource.DEFAULT, SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize); AudioTrack多了AudioTrack.MODE_STREAM這個選項。AudioTrack.MODE_STREAM是指串流的資料。AudioTrack.MODE_STATIC是指一次把整個音源檔載入。 兩個類都有bufferSize這個參數。bufferSize 是需要計算的,也可能跟手機的硬體能力有關。所以兩個類都有提供計算的方法。 int bufferSize = AudioRecord.getMinBufferSize( SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); int bufferSize = AudioTrack.getMinBufferSize( SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT); 這樣我們可以建一個Thread來讓AudioTrack播串流音樂 void playMusic() {     new Thread(new Runnable() {     @Override     pub

FileProvide 快速使用

google建議未來要使用手機內部儲存的空間都要先問使用者。 if(ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, new String[{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_CODE_ASK_WRITE_EXTERNAL_STORAGE_PERMISSIONS);} 這樣就會出現詢問是否讓app使用儲存空間。 接下來用FileProvider,快速使用法 1.在res/xml/建一個 file_paths.xml 的檔案,內容如下。這個檔的作用就是,當我們要得到Uri的路徑時,images這個資料匣名稱(參考下方的XML檔),就會用my_images來替代。以我們的例子,Uri就會變成 content://comp.example.test/my_images/default_image.jpeg <paths xmlns:android="http://schemas.android.com/apk/res/android">     <files-path name="my_images" path="images/"/>     <files-path name="my_docs" path="docs/"/> </paths> 2.AndroidManifest.xml中 <application> …     <provider         android:name="android.support.v4.content.FileProvider"         android:authorities=" comp.e

Image Frame Animation 多圖動畫

要在android的ImageView載入連續圖產生動化效果,我們需要先建一個animation-list的XML,名稱為anim1.xml <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/anim1" android:oneshot="false" android:visible="true"> <item android:drawable="@drawable/im1" android:duration="500"/> <item android:drawable="@drawable/im2" android:duration="500"/> <item android:drawable="@drawable/im3" android:duration="500"/> <item android:drawable="@drawable/im4" android:duration="500"/> <item android:drawable="@drawable/im5" android:duration="500"/> </animation-list> im1, im2...im5是指放在drawable中的連續圖。 android:oneshot->false是指無限循環, true是指不循環。 android:duration 的 500是 500ms的意思。 在layout   main.xml中 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&quo

android 遊戲排行榜

圖片
為了使用排行榜,我們需要先登入sign in。為了登入,我們要做憑證。 先到google api console在左邊欄選 憑證。 點建立憑證 選android,下方就會出現要填入的資料 重點是第二個紅框,在TERMIAL 或是微軟的CMD中以指令方式 keytool -list -keystore <path-to-production-keystore> <path-to-production-keystore>指的是app的keystore檔的位置。然後把出現的SHA1填入。 第二個紅框下方是套件名稱,就是你要使用排行榜的APP套件名稱。 建立之後就會出現新的用戶端ID。如第一張圖。其它在名稱中出現AUTO CREATE都不要動它,都是自己長出來的。 接下來到google play console中的遊戲服務中 注意平台那一欄,因為我們是ANDROID系統的服務,設定完成,小綠人要變灰色。我們點擊新增遊戲。 第一次新增的話,我們選我尚未在自己的遊戲中使用任何GOOGLE API。有用過,就選右邊"我已經在自己的遊戲中使用GOOGLE API。紅框中資料填好,完成如下 目前因為沒有連結應用程式,所以平台的兩個圖示還是淺灰色。 在左邊欄選已連結的應用程式 選ANDROID 嗯,填一填,套件要跟剛剛在google api console填的一樣。 建排行榜 嗯一樣,填一填,不用怕,建錯了可以再建就是。 完成,點擊 取得資源 得到 把這個貼到APP的RES/VALUES中,建一個ids.xml 到這裡告一段落。前面這些動作都是為了憑證設置。接下來我們要在APP中使用如下。 正常的登入,如果有多個帳號會出現畫圖給使用者選擇。使用者會被尋問是否想登入。 private void startSignInIntent() {   GoogleSignInClient signInClient = GoogleSignIn.getClient(this,       GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN);   Intent int

幾個android常用到的動態XML

Animation animation; animation = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.xxxx_animation); R.anim.XXXX_animation 就以下面的XML,記得放在res/anim/之中,沒有anim,就需要自已在res底下建一個anim的資料匣 Button.startAnimation(animation); 使用方式如上,startAnimation(animation) 即可。 XML 範例 Fade Out Animation <set xmlns:android="http://schemas.android.com/apk/res/android"     android:fillAfter="true" >     <alpha         android:duration="2000"         android:fromAlpha="0.0"         android:interpolator="@android:anim/accelerate_interpolator"         android:toAlpha="1.0" /> </set> Zoom In Animation <set xmlns:android="http://schemas.android.com/apk/res/android"     android:fillAfter="true" >     <scale         xmlns:android="http://schemas.android.com/apk/res/android"         android:duration="1200"         android:fromXSca

隱私權政策 Privacy Policy

1.  隱私權政策簡介  本人所創作之軟體(APP),為尊重您的隱私權、保護您的個人資訊,我們將遵循以下基本原則: 1.蒐集您的個人資訊時,我們會清楚指出目的。 2.個人資訊將被蒐集時,我們會事先通知您且徵詢您的同意。 3.除非經您的同意或基於法律要求,否則我們不揭露您的個人資訊。 4.我們會安全的保護您的個人資訊。 5.您可以對以上的隱私權政策提出意見。 2. 本人APP中所收集的資訊為何?  a.  您提供的資訊  - 交易及付款資訊 為處理購物與支付服務的相關交易服務或付款程序,因應相關服務所生之交易資料、付款金額與方式、用戶的信用卡資訊可能會被取得。請注意,購物程序應由適當的付款機構完成,我們不會保留任何信用卡資訊。此資料為Google play所收集。   b. 您使用本人軟體時被收集的資料  - 記錄 不收集個人帳戶資訊,個人帳號的情形下,記錄最常使用之功能。本人使用Googlef所提供的Google Analytics協助此記錄的完成。 - 裝置資訊 我們可能取得您的裝置資訊(如應用程式版本、作業系統版本、語言與國家設定、裝置型號)。此資訊只用於軟體功能的開發,提昇軟體使用體驗,不會有其它非法使用。 硬體權限之取得專為app正常功能運作所需。app作者不會使用硬體權限在app功能以外之範圍。 相機、麥克風、帳戶、聯絡人或電話 功能之取得,如為錄音功能,app中可以直接明顯了解錄音之目的。不會有使用者未知之功能實踐。   3. 本人開發之軟體會如何利用蒐集到的資訊?  - 為用戶提供平穩流暢的使用體驗 - 遵守相關法律與法定義務。    4. 本人開發之APP是否分享蒐集到的資訊?  未經您的同意,我們不會向第三人提供您的資訊。我想我也沒有這個能力。   5. 本公司是否與其他服務供應商合作?  無   6. 個人資訊會保存多久?  本人開發之軟體都是教學跟知識傳播之軟體。所以不會保留任何人之資訊。   7 . 外部連結 - 外部資料連結 app中有任何連結,若為app作者所提供,皆為安全之連結且 無色情、成人、賭博,酒精等不合兒童之內容。 。無任何惡意程式。使用者可安心使用。app作者亦會盡到監督之責。 -廣告 本人使之用廣告SDK為ADMOB。無色情、成人、賭博,酒精等不合兒童之廣告。 13. 是否有意見?是否有疑問?  若對我們的隱私權政策或處理個