發表文章

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

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可以不加。

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

簡單的android MediaPlayer 使用

紅定字體為需要自已修改的地方 R.raw.voice_189是要播放的檔案。先在Res中建一個raw的資料匣,把聲音檔放進去,這裡音檔為voice_189 public static MediaPlayer mediaPlayer; if (mediaPlayer == null) {         mediaPlayer = new MediaPlayer();       } mediaPlayer = MediaPlayer.create( this.context .getApplicationContext(), R.raw.voice_189 ); mediaPlayer.setLooping( true ); // Set looping mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); final AudioManager mAudioManager = (AudioManager) this.context.getSystemService(AUDIO_SERVICE); final int originalVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0); 想要關掉如下 確是是否在播放中  isPlaying, 然後先STOP,再RESET。最後真得不要再RELEASE if (mediaPlayer.isPlaying()){         mediaPlayer.stop();         mediaPlayer.reset();         mediaPlayer.release();       }

android studio signed apk

圖片
有時候我們會希望每次編譯出來的 apk 都是有 sign 過的,Android Studio 提供了這樣的選擇。 方法如下,當然也可以直接在Gradle中寫好。 不過我們還是用用圖形介面比較方便。 一、點擊左下方的Build Variants,會跳出側邊欄位如下。在跳出來的欄位裡面Build Variant中選release。 二、我們到app資料匣,點右鍵,選Open Module Settings。如下 三、先選Signing,自己新增一個認證。 Name,key Alias,key Password, Store File, Store Password, 這幾項都填一填。 四、再選Build Types, 先選release ,在 Signing Config 中選第三個步驟中自己新增的認證,剛剛的 Name 會出現在下拉選單中。 五、最後,按OK。這樣就大功告成。接下來每次編譯就會直接給出 sign 過的 apk。

android studio 查看繼承的原始碼

圖片
Navigate  menu >  Type Hierarchy 出現如圖。就可以點進去看每個繼承的原始碼。

Unsupported major.minor version 52.0 報錯

其一 一般來說,Unsupported major.minor version 52.0出現時,為什麼會有這個錯誤呢?這是java版本的問題,52.0是主要版本號.次要版本號(major.minor)。每一個被編譯程式都會有其適用的版本號的資訊,可以用 javap -verbose XXXX 就可以看到適用的版號。如果不是目前JDK的適用範圍,當我們執行時就會出錯了。 我們可以在terminal中打上 java -version 看看目前的java 版本 要轉移平台或環境,確認版本有其必要。 我們可以先用 jdk 1.8 編釋一個小程式,然後再把jdk換成1.7執行看看,就會出現 Unsupported major.minor version 52.0 所以我們可以在 https://en.wikipedia.org/wiki/Java_class_file#General_layout 找到各版本支援的版本號,這樣就不會弄錯了。簡單記錄一下。 java SE 9 = 53 (0x35 hex), Java SE 8 = 52 (0x34 hex), Java SE 7 = 51 (0x33 hex), Java SE 6.0 = 50 (0x32 hex), Java SE 5.0 = 49 (0x31 hex), JDK 1.4 = 48 (0x30 hex), JDK 1.3 = 47 (0x2F hex), JDK 1.2 = 46 (0x2E hex), JDK 1.1 = 45 (0x2D hex). 其二 在android studio上可能就是compileSdkVersion跟buildToolVersion版本有所不同。如下,將兩者改為一樣的版本 24,問題即可解決。 android{ compileSdkVersion    24 buildToolVersion         24.0.1

Element animation-list must be declared 報錯

Element animation-list must be declared Android Studio 對於資源的放置位置有比較嚴重的定義。原先 <? xml version= "1.0" encoding= "utf-8" ?>   <animation-list android :id= "@+id/find_people_anim"   android :oneshot= "true" xmlns: android = "http://schemas.android.com/apk/res/android" > <item android :drawable= "@drawable/findpeople1" android :duration= "500" />    <item android :drawable= "@drawable/findpeople2" android :duration= "500" />    <item android :drawable= "@drawable/findpeople3" android :duration= "500" />    <item android :drawable= "@drawable/findpeople4" android :duration= "500" />   <item android :drawable= "@drawable/findpeople5" android :duration= "500" /> </animation-list> 這個資源都是放在anim的資料匣下,這樣是不行的。所以改放在drawable下,即可解決。

Firebase 與 AdMob

圖片
啊!平台跟通路真的是王道啊!叫你往東,就得往東。 從eclipse轉到android studio看樣子是在所難免。連analytics, admob也都跟firebase整合了。也就是說未來轉到firebase也是在所難免。不過也有好處,整合的功能不少。有空就一一來寫。 如果是要結合admob https://firebase.google.com/docs/admob/android/quick-start 我們重點的跑一遍 第一點改 App - level build.gradle 第二點改 Project-level build.gradle       第三點找出 本來ADMOB的廣告單元編號,記得要先跟firebase連結,就會出現最下方的廣告單元編號與舊版發佈商編號。 在參閱設定操作說明中有 應用程式編號 ,我們可以看到後面xxxxxx~nnnnnnnn有一個 ~ 的符號。 廣告單元編號 是xxxxxxx/nnnnnnn有一個 / 的符號。不要搞混了。 提醒使用者要一個activity就申請一個廣告單元。  貼心提示使用者可以把很多的id都放在resource中,如下  第三點,程式跟之前大同小異 重點是呼叫廣告前要先執行  MobileAds.initialize....如下,記得後面的編號是  應用程式編號!! 然後在xml中,廣告編號可xml中加,也可以在 activity 中  A dView.setAdUnitId( "ca-app-pub-2831471Xxxxxxx/9nnnnnnnn" );    或從resource中 ADView.setAdUnitId(getString(R.string.XXXXX)); 主程式 這樣就可以了…我還有遺漏什麼…咦… 對…json 先到 firebase console     https://console.firebase.google.com/ 照指示新增,或是匯入google應用,就可以看到如下 選擇紅框中->管理 下載google-services.json, 將

finished with non-zero exit value

又來了... finished with non-zero exit value 1 這個容易解,從錯誤訊習中可以找到問題。 finished with non-zero exit value 2 從eclipse轉到android studio容易發生,這個是jar的衝突。即然用了gradle來編譯程式,就要把libs中的jar通通砍了。 finished with non-zero exit value 3 記憶體不足。用這個 android { // Other stuffs dexOptions { javaMaxHeapSize "4g" } }

討厭… ADB not responding. You can wait more,or kill “adb.exe” process manually and click 'Restart'

圖片
google 今年又發表了很多新東西,使得原本使用eclipse的人慢慢的要轉移平台到android studio來。一開始就遇 adb 的問題,然後android studio提示要kill adb,如下 看過網路上的諸多作法,adb kill-server,然後 adb start-server。只要看到出現訊息 daemon started successfully,就成功了。 如果不是呢?出現 WSAPOLL找不到輸入點之類的,就找一版舊的adb.exe來把android studio所使用的 adb.exe 取代掉即可。 突然想到在c糟中還有一份android-adk,趕快去找 android-sdk 底下的 platform-tools底下的adb.exe。直接copy,然後取代了android studio的adb.exe… 終於解決。