From: xiewei <892331662@qq.com>
Date: Mon, 17 Feb 2025 08:54:54 +0000 (+0800)
Subject: 250217:第一版
X-Git-Url: http://git.snicker.com.cn/sitemap.xml?a=commitdiff_plain;h=0640e55c79285c4e5bfb728ae81519f4444d8fde;p=mirrors%2Fpoly-sdk.git
250217:第一版
---
diff --git a/app/build.gradle b/app/build.gradle
index 116c041..4ba284a 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -38,7 +38,7 @@ dependencies {
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
implementation project(path: ':polysdk')
-// implementation(fileTree("libs/Poly-SDK-1.3-202407061157.aar"))
+// implementation(fileTree("libs/Poly-SDK-1.6-202409021027.aar"))
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.google.code.gson:gson:2.10'
implementation 'com.github.bumptech.glide:glide:4.0.0-RC1'
diff --git a/app/libs/Poly-SDK-1.6-202409021027.aar b/app/libs/Poly-SDK-1.6-202409021027.aar
new file mode 100644
index 0000000..e495089
Binary files /dev/null and b/app/libs/Poly-SDK-1.6-202409021027.aar differ
diff --git a/app/libs/Poly-SDK-1.6-202410251023.aar b/app/libs/Poly-SDK-1.6-202410251023.aar
new file mode 100644
index 0000000..f242144
Binary files /dev/null and b/app/libs/Poly-SDK-1.6-202410251023.aar differ
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 8cca1e2..9e59667 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -3,12 +3,13 @@
xmlns:tools="http://schemas.android.com/tools">
-
+
+
+ tools:targetApi="31">
+
diff --git a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/AsrActivity.java b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/AsrActivity.java
index 1b1406a..f9f306c 100644
--- a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/AsrActivity.java
+++ b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/AsrActivity.java
@@ -130,6 +130,16 @@ public class AsrActivity extends AppCompatActivity {
mediaPlayer.playData(msg);
}
+ @Override
+ public void onSynthesisEnd() {
+
+ }
+
+ @Override
+ public void onFail(String msg) {
+
+ }
+
@Override
public void onLongTextStreamChange(byte[] msg) {
mediaPlayer.playData(msg);
@@ -143,7 +153,7 @@ public class AsrActivity extends AppCompatActivity {
public void onSuccess(Object result) {
String text = (String) result;
speedSb2.append(text);
- PolymerizeAgent.getInstance().getAiAPI().sendLongTextStream(text);
+ PolymerizeAgent.getInstance().getAiAPI().sendLongTextStream(text,"mp3",8000);
Log.i(TAG,"translate--"+text);
runOnUiThread(new Runnable() {
@Override
@@ -155,7 +165,6 @@ public class AsrActivity extends AppCompatActivity {
}
msgAdapter2.notifyItemChanged(msgPosition2);
-
}
});
}
diff --git a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/AudioPlayer.java b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/AudioPlayer.java
index 927411d..5d52b13 100644
--- a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/AudioPlayer.java
+++ b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/AudioPlayer.java
@@ -3,12 +3,16 @@ package com.zhixun.android.sdk.polymerizesdk;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
+import android.os.Bundle;
import android.os.Handler;
+import android.os.Looper;
import android.os.Message;
import android.util.Log;
import androidx.annotation.NonNull;
+import com.zhixun.android.sdk.polysdk.authentication.AuthMsgSendHandler;
+
import java.util.ArrayList;
import java.util.List;
@@ -18,17 +22,38 @@ public class AudioPlayer {
private final int MSG_PLAY = 101;
private String TAG = "AudioPlayer";
private List playList = new ArrayList<>();
- private Handler audioHandler = new Handler(){
- @Override
- public void handleMessage(@NonNull Message msg) {
- super.handleMessage(msg);
- switch (msg.what){
- case MSG_PLAY:
-
- break;
- }
+ private Handler audioHandler;
+ private AudioLooperThread audioLooperThread;
+ class AudioLooperThread extends Thread {
+ public void run() {
+ Looper.prepare();
+ audioHandler = new Handler(){
+ @Override
+ public void handleMessage(@NonNull Message msg) {
+ super.handleMessage(msg);
+ switch (msg.what){
+ case MSG_PLAY:
+ Log.i(TAG,"play---111---");
+ byte[] data = (byte[]) msg.obj;
+ if (audioTrack != null) {
+ audioTrack.play();
+ int length = data.length;
+ while (length > 0&&audioTrack != null) {
+ int written = audioTrack.write(data, 0, length);
+ length -= written;
+ }
+ Log.i(TAG,"play---end---");
+ }
+
+ break;
+ }
+ }
+ };
+ Looper.loop();
+
}
- };
+ }
+
public AudioPlayer(int sampleRate, int channelConfig, int audioFormat) {
// åå§åbuffer size
@@ -39,24 +64,27 @@ public class AudioPlayer {
}
public AudioPlayer() {
+ audioLooperThread = new AudioLooperThread();
+ audioLooperThread.start();
int sampleRate = 16000;
int channelConfig = AudioFormat.CHANNEL_OUT_STEREO;
- int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
+ int audioFormat = AudioFormat.ENCODING_PCM_8BIT;
// åå§åbuffer size
bufferSize = AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat);
// åå§åAudioTrack
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
- sampleRate, channelConfig, audioFormat, bufferSize, AudioTrack.MODE_STREAM);
+ sampleRate,
+ AudioFormat.CHANNEL_OUT_MONO,
+ AudioFormat.ENCODING_PCM_16BIT,
+ bufferSize,
+ AudioTrack.MODE_STREAM);
audioTrack.setPositionNotificationPeriod(bufferSize);
audioTrack.setPlaybackPositionUpdateListener(new AudioTrack.OnPlaybackPositionUpdateListener() {
@Override
public void onMarkerReached(AudioTrack track) {
//ææ¾å®æ
Log.i(TAG,"onMarkerReached");
- if(playList.size()>0){
- play(playList.get(0));
- playList.remove(0);
- }
+
}
@Override
@@ -66,53 +94,25 @@ public class AudioPlayer {
});
}
+ private byte[] cacheAudio = new byte[0];
+ public synchronized void play(byte[] audioData) {
+ Log.i(TAG,"play---"+cacheAudio.length);
+// if(cacheAudio.length<40*1024){
+// cacheAudio = ByteTools.concatAll(cacheAudio,audioData);
+// }else {
+ Message message = new Message();
+ message.what = MSG_PLAY;
+ message.obj = audioData;
+ audioHandler.sendMessage(message);
+ cacheAudio = new byte[0];
+// }
- public void play(byte[] audioData) {
- if (audioTrack != null) {
-
- int state = audioTrack.getPlaybackHeadPosition();
- Log.e(TAG,"paly state="+state);
- if (state > 0) {
- // AudioTrackæ£å¨ææ¾ææå
- playList.add(audioData);
- }else {
- new Thread(new Runnable() {
- @Override
- public void run() {
- // åå
¥æ°æ®å¹¶ææ¾
- audioTrack.write(audioData, 0, audioData.length);
- // ææ¾é³é¢
- audioTrack.play();
- double audioDurationInSeconds = (double) audioData.length / (audioTrack.getSampleRate() * 2);
- long len = (long) audioDurationInSeconds;
- if(len<1){
- len = 1;
- }
- try {
- Thread.sleep(len);
- Log.e(TAG,"playState---"+len);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- audioTrack.stop();
- if(playList.size()>0){
- play(playList.get(0));
- playList.remove(0);
- }
-
-
- }
- }).start();
-
- }
-
- }
}
+
public void stop() {
if (audioTrack != null) {
- // åæ¢å¹¶éæ¾èµæº
audioTrack.stop();
audioTrack.release();
audioTrack = null;
diff --git a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/ChatActivity.java b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/ChatActivity.java
index d9380b6..4dbe0b4 100644
--- a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/ChatActivity.java
+++ b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/ChatActivity.java
@@ -19,6 +19,7 @@ import com.zhixun.android.sdk.polysdk.PolymerizeAgent;
import com.zhixun.android.sdk.polysdk.callback.IAIChannelChangeCallback;
import com.zhixun.android.sdk.polysdk.callback.IAudioConvertListener;
import com.zhixun.android.sdk.polysdk.callback.OnChatMsgListener;
+import com.zhixun.android.sdk.polysdk.callback.OnTTSDataChange;
import com.zhixun.android.sdk.polysdk.callback.OnTranscriptionDataChange;
import java.io.File;
@@ -40,8 +41,9 @@ public class ChatActivity extends AppCompatActivity {
private boolean isStartTranscrip = false;
private StringBuffer speedSb = new StringBuffer();
private StringBuffer chatBuff = new StringBuffer();
+ private AudioPlayer audioPlayer;
-
+ private StringBuffer ttsStr = new StringBuffer();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -53,9 +55,10 @@ public class ChatActivity extends AppCompatActivity {
msg_listview.setAdapter(msgAdapter);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
msg_listview.setLayoutManager(layoutManager);
-
+ audioPlayer = new AudioPlayer();
PolymerizeAgent.getInstance().getAiAPI().startTrans();
+
PolymerizeAgent.getInstance().getAiAPI().setOnChatMsgListener(new OnChatMsgListener() {
@Override
public void onChange(String type, String text) {
@@ -75,8 +78,20 @@ public class ChatActivity extends AppCompatActivity {
}else if(chatType.equals("end")){
chatPosition = -1;
chatBuff = new StringBuffer();
+ if(ttsStr.length()>0){
+ PolymerizeAgent.getInstance().getAiAPI().sendLongTextStream(ttsStr.toString(),"pcm",16000);
+ ttsStr = new StringBuffer();
+ }
}else {
if(!TextUtils.isEmpty(text)){
+ Log.i(TAG,"ttsStr--"+ttsStr.length());
+// ttsStr.append(text);
+// if(text.contains("ï¼")&&ttsStr.length()>0){
+// PolymerizeAgent.getInstance().getAiAPI().sendLongTextStream(ttsStr.toString());
+// ttsStr = new StringBuffer();
+// }
+ PolymerizeAgent.getInstance().getAiAPI().runSynthesis(text);
+
msg_listview.post(new Runnable() {
@Override
public void run() {
@@ -146,7 +161,6 @@ public class ChatActivity extends AppCompatActivity {
@Override
public void run() {
ed_content.setText(speedSb.toString());
-
}
});
}
@@ -154,6 +168,30 @@ public class ChatActivity extends AppCompatActivity {
}
});
+ PolymerizeAgent.getInstance().getAiAPI().setOnTTSDataChange(new OnTTSDataChange() {
+ @Override
+ public void onSynthesisChange(byte[] msg) {
+ Log.e(TAG,"onSynthesisChange--"+msg.length);
+ audioPlayer.play(msg);
+ }
+
+ @Override
+ public void onSynthesisEnd() {
+ Log.e(TAG,"onSynthesisEnd--");
+ }
+
+ @Override
+ public void onFail(String msg) {
+ Log.e(TAG,"onFail--");
+ }
+
+ @Override
+ public void onLongTextStreamChange(byte[] msg) {
+ Log.e(TAG,"onLongTextStreamChange--"+msg.length);
+ audioPlayer.play(msg);
+ }
+ });
+ PolymerizeAgent.getInstance().getAiAPI().startSynthesis("pcm",16000);
}
public void back(View view){
@@ -183,12 +221,13 @@ public class ChatActivity extends AppCompatActivity {
//moonshot (kimi 模åï¼moonshot-v1-8k)
//aliyun ï¼éä¹åé® æ¨¡åï¼qwen-plusï¼
//huoshan ï¼è±å
模åï¼ep-20240611101421-5qk8sï¼
- PolymerizeAgent.getInstance().getAuthenAPI().setAIChannelKey("CHAT GPT", API_KEY, new IAIChannelChangeCallback() {
+ /*PolymerizeAgent.getInstance().getAuthenAPI().setAIChannelKey("CHAT GPT", API_KEY, new IAIChannelChangeCallback() {
@Override
public void onChange(boolean result, String channel) {
Log.d(TAG,"result--"+result+"--channel--"+channel);
}
- });
+ });*/
+ PolymerizeAgent.getInstance().getAiAPI().stopSynthesis();
}
public void setBaidu(View view){
@@ -264,6 +303,8 @@ public class ChatActivity extends AppCompatActivity {
protected void onDestroy() {
super.onDestroy();
PolymerizeAgent.getInstance().getAiAPI().stopTrans();
+ PolymerizeAgent.getInstance().getAiAPI().stopSynthesis();
+ audioPlayer.stop();
}
public void smbcTopcm(View view){
@@ -314,4 +355,6 @@ public class ChatActivity extends AppCompatActivity {
return null;
}
}
+
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/MainActivity.java b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/MainActivity.java
index b3bb7a4..8ba5809 100644
--- a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/MainActivity.java
+++ b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/MainActivity.java
@@ -62,8 +62,6 @@ public class MainActivity extends AppCompatActivity {
startActivity(new Intent(this, ChatActivity.class));
-
-
}
public void goTranslate(View view){
if(!isLogin){
@@ -88,6 +86,14 @@ public class MainActivity extends AppCompatActivity {
startActivity(new Intent(this, AsrActivity.class));
}
+ public void goVoiceChat(View view){
+ if(!isLogin){
+ Toast.makeText(this,"请å
é´æ",Toast.LENGTH_SHORT).show();
+ return;
+ }
+ startActivity(new Intent(this, VoiceChatActivity.class));
+ }
+
public void onespeed(View view){
if(!isLogin){
Toast.makeText(this,"请å
é´æ",Toast.LENGTH_SHORT).show();
@@ -116,8 +122,8 @@ public class MainActivity extends AppCompatActivity {
startActivity(new Intent(this, PicTestActivity.class));
}
public void goRegiest(View view){
- PolymerizeAgent.getInstance().getAuthenAPI().regiest("HHosiYUNdG42t1cTgKOzIUPOvAVMI2QT"
- , "FD2420000083", "pafOCKLiUbeVHbdZlddH", new AuthCallback() {
+ PolymerizeAgent.getInstance().getAuthenAPI().regiest("YqggeKCxfEOVQGjUYrpQQdEstGpvojzn"
+ , "28110687C457", "WTxAKo2qD2pXOZZLW3zz", new AuthCallback() {
@Override
public void onSuccess(String result) {
Log.i(TAG,"result--"+result);
@@ -152,12 +158,19 @@ public class MainActivity extends AppCompatActivity {
productKey = ccvUoJOLbXn
secretKey = nNRjkRpKTxvprGaW
deviceSecret = ZqqFHYeXf4xuv5jEfuHUE2hdMnoaegGi*/
-
- private String pwd = "CVOachlw1DO1Ei5uabOkHd1wRYoMQA";
+ //28110687C456
+// FD230
+// pidï¼Y1DxRdBfnzVZQrXHdrNl
+// keyï¼4EepovakpbqhZUnUDwH42KAADYGv4UUe
+//
+// FD242
+// pidï¼pafOCKLiUbeVHbdZlddH
+// keyï¼HHosiYUNdG42t1cTgKOzIUPOvAVMI2QT
+ private String pwd = "HFXNgAAWqUVsBPJEyMyoTxnoJV5aQT";
public void goLogin(View view){
pwd = SpUtils.getInstance().getStringValue("devicePwd");
- PolymerizeAgent.getInstance().getAuthenAPI().authentication("FD2420000083"
- , pwd, "HHosiYUNdG42t1cTgKOzIUPOvAVMI2QT", new AuthCallback() {
+ PolymerizeAgent.getInstance().getAuthenAPI().authentication("28110687C457"
+ , pwd, "YqggeKCxfEOVQGjUYrpQQdEstGpvojzn", new AuthCallback() {
@Override
public void onSuccess(String result) {
isLogin = true;
@@ -212,7 +225,7 @@ public class MainActivity extends AppCompatActivity {
Toast.makeText(this,"请å
é´æ",Toast.LENGTH_SHORT).show();
return;
}
- String in = "/sdcard/Android/data/com.zhixun.android.sdk.polymerizesdk/files/temp.msbc";
+ String in = "/sdcard/Android/data/com.zhixun.android.sdk.polymerizesdk/files/2025-02-10_17-29-32.opus";
String out = "/sdcard/Android/data/com.zhixun.android.sdk.polymerizesdk/files/out.pcm";
File infile = new File(in);
byte[] indata = readFile(infile);
diff --git a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/MyMediaPlayer.java b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/MyMediaPlayer.java
index 668e73b..f869e95 100644
--- a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/MyMediaPlayer.java
+++ b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/MyMediaPlayer.java
@@ -48,7 +48,7 @@ public class MyMediaPlayer {
new Thread(new Runnable() {
@Override
public void run() {
- if (mediaPlayer.isPlaying()) {
+ if (mediaPlayer.isPlaying()||sourceList.size()>0) {
try {
File tempMp3 = File.createTempFile("temp_" + System.currentTimeMillis(), ".mp3");
// tempMp3.deleteOnExit();
@@ -99,7 +99,7 @@ public class MyMediaPlayer {
mediaPlayer.prepare();
mediaPlayer.start();
} catch (Exception ex) {
- String s = ex.toString();
+ String s = ex.getMessage();
Log.d(TAG, "playData-2-" + s);
ex.printStackTrace();
}
diff --git a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/PicTestActivity.java b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/PicTestActivity.java
index 3d6d039..d25f525 100644
--- a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/PicTestActivity.java
+++ b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/PicTestActivity.java
@@ -64,6 +64,7 @@ public class PicTestActivity extends AppCompatActivity {
Log.i(TAG, "compressRetsFromJNI: id = " + id + " state = " + state + " tileWidth = " + tileWidth + " len = " + data.length);
compressedFile = writeBuffer("ComRets" + tileWidth, data, 0, data.length);
runOnUiThread(() -> btnCompress.setEnabled(true));
+ runOnUiThread(() -> Toast.makeText(PicTestActivity.this,"å缩æå",Toast.LENGTH_SHORT).show());
}
});
@@ -117,6 +118,7 @@ public class PicTestActivity extends AppCompatActivity {
public void deCompressRets(int id, int state, Bitmap bitmapDe) {
runOnUiThread(() -> destPic.setImageBitmap(bitmapDe));
+ runOnUiThread(() -> Toast.makeText(PicTestActivity.this,"è§£åæå",Toast.LENGTH_SHORT).show());
}
});
diff --git a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/VoiceChatActivity.java b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/VoiceChatActivity.java
new file mode 100644
index 0000000..09efda3
--- /dev/null
+++ b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/VoiceChatActivity.java
@@ -0,0 +1,53 @@
+package com.zhixun.android.sdk.polymerizesdk;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+
+import com.zhixun.android.sdk.polymerizesdk.adapter.MsgAdapter;
+import com.zhixun.android.sdk.polysdk.PolymerizeAgent;
+import com.zhixun.android.sdk.polysdk.ai.VoiceChatManager;
+
+import java.util.ArrayList;
+
+public class VoiceChatActivity extends AppCompatActivity {
+
+ private String TAG = "VoiceChatActivity";
+ private RecyclerView msg_listview;
+ private MsgAdapter msgAdapter;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_voice_chat);
+ msg_listview = findViewById(R.id.msg_listview);
+
+ msgAdapter = new MsgAdapter(this,new ArrayList<>());
+ msg_listview.setAdapter(msgAdapter);
+ LinearLayoutManager layoutManager = new LinearLayoutManager(this);
+ msg_listview.setLayoutManager(layoutManager);
+
+// VoiceChatManager.getInstance().start();
+ }
+
+ public void back(View view){
+ finish();
+ }
+
+
+ public void start(View view){
+ VoiceChatManager.getInstance().startSend();
+ AudioRecorderMan.getInstance().startRecording(this);
+ AudioRecorderMan.getInstance().setOnBuffChange(new AudioRecorderMan.onBuffChange() {
+ @Override
+ public void onChange(byte[] data) {
+ Log.i(TAG,"Audio-onChange-"+data.length);
+ VoiceChatManager.getInstance().sendVoice(data);
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
index 07d5da9..10fb7fd 100644
--- a/app/src/main/res/drawable/ic_launcher_background.xml
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -1,170 +1,37 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml
index 2b068d1..98ce79a 100644
--- a/app/src/main/res/drawable/ic_launcher_foreground.xml
+++ b/app/src/main/res/drawable/ic_launcher_foreground.xml
@@ -1,30 +1,6 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml
index 40944ef..41d008c 100644
--- a/app/src/main/res/layout/activity_chat.xml
+++ b/app/src/main/res/layout/activity_chat.xml
@@ -35,7 +35,7 @@
android:layout_weight="1"
android:layout_height="match_parent"
android:background="@null"
- android:text="é©å½å¯æå¤§å¦2014å±çå¦çæå¤å°äºº"/>
+ android:text="åä¸ç¯å
³äºå¤å¤©ç300å使"/>
+
+