一、核心功能
- 翻译
- 单词卡
二、翻译功能
- 测试
http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=item
- 返回数据
{
"type": "EN2ZH_CN",
"errorCode": 0,
"elapsedTime": 1,
"translateResult": [
[
{
"src": "item",
"tgt": "项"
}
]
]
}
- 效果
三、主要代码实现
- AndroidManifest.xml
需要给予网络和储存卡读写权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
- 翻译
public class Translator {
String tranUrl = "http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=";
public Translator() {}
public String tran(String req) {
HttpURLConnection conn = null;
BufferedReader buf = null;
StringBuilder getRes = new StringBuilder();
String res = "NULL";
try {
URL url = new URL(tranUrl + req);
conn = (HttpURLConnection) url.openConnection();
if (conn.getResponseCode() == 200) {
buf = new BufferedReader(new InputStreamReader(conn.getInputStream()));
for (String s = buf.readLine(); s != null; s = buf.readLine()) {
getRes.append(s);
}
String temp = getRes.toString();
JSONObject obj = new JSONObject(temp);
JSONArray jsonArray = obj.getJSONArray("translateResult");
JSONArray jsonArray2 = jsonArray.getJSONArray(0);
JSONObject tgt = jsonArray2.getJSONObject(0);
Log.e("item", tgt.getString("tgt"));
res = tgt.getString("tgt");
buf.close();
}
} catch (Exception e) {}
return res;
}
}
组件 | id |
---|
Buttton | submit |
EditText | content |
public void waitForRes() {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().penaltyLog().build());
}
public void translation() {
submit = findViewById(R.id.submit);
content = findViewById(R.id.content);
waitForRes();
submit.setOnClickListener(new SubmitContent());
}
class SubmitContent implements View.OnClickListener {
@Override
public void onClick(View view) {
String req = content.getText().toString();
if (req.length() == 0) {
Toast.makeText(HelperActivity.this,"请输入内容",Toast.LENGTH_SHORT).show();
return;
}
Translator translator = new Translator();
String res = translator.tran(req);
AlertDialog.Builder dialog = new AlertDialog.Builder(HelperActivity.this);
dialog.setTitle(req + "翻译结果");
dialog.setMessage(res);
dialog.setNegativeButton("确定", new OkClick());
dialog.setPositiveButton("收藏", new CollectClick(req, res));
dialog.create();
dialog.show();
}
}
class OkClick implements DialogInterface.OnClickListener {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
}
class CollectClick implements DialogInterface.OnClickListener {
String txt1, txt2;
public CollectClick(String req, String res) {
txt1 = req;
txt2 = res;
}
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (!"NULL".equals(txt2)) {
wordsCollector("words.txt", txt1+"&&&"+txt2+"---");
}
dialogInterface.cancel();
Toast.makeText(HelperActivity.this,
txt1 + "&" + txt2 + " 收藏成功",
Toast.LENGTH_SHORT).show();
}
}
- 单词列表
组件 | id |
---|
ListView | wordsList |
Switch | clearSwitch |
String[] words;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_collection);
wordsList = findViewById(R.id.wordsList);
words = readFile(fn.wordsFileName).split("---");
wordsList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, words));
wordsList.setOnItemClickListener(new WordsChoice());
collectionActivity = findViewById(R.id.collectionActivity);
collectionActivity.setOnTouchListener(new OnTouch());
clearSwitch = findViewById(R.id.clearSwitch);
clearSwitch.setOnCheckedChangeListener(new ClearAllWords());
}
public String readFile(String fileName) {
String res = "";
try {
FileInputStream fis = openFileInput(fileName);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
char[] in = new char[fis.available()];
isr.read(in);
isr.close();
fis.close();
res = new String(in);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return res;
}
public void overwriteFile(String fileName, String content) {
try {
FileOutputStream fos = openFileOutput(fileName, Context.MODE_PRIVATE);
OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
osw.write(content);
osw.flush();
fos.flush();
osw.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
class WordsChoice implements AdapterView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent = new Intent(CollectionActivity.this, WordsViewActivity.class);
bundle.putString("index",String.valueOf(i));
bundle.putStringArray("wordsList",words);
intent.putExtras(bundle);
startActivity(intent);
}
}
class ClearAllWords implements CompoundButton.OnCheckedChangeListener {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (!compoundButton.isPressed()) {
return;
}
if (b) {
overwriteFile(fn.wordsFileName, "");
Toast.makeText(CollectionActivity.this,
"清除成功", Toast.LENGTH_SHORT).show();
startActivity(new Intent(CollectionActivity.this, HelperActivity.class));
}
}
}
- 单词卡
组件 | id |
---|
TestView | wordIndex |
TestView | wordView |
ConstraintLayout | wordsViewActivity |
ConstraintLayout wordsViewActivity;
int oldY, newY, oldX, newX, thresholdX = 400, thresholdY = 700;
int index;
TextView wordIndex, wordView;
String[] wordsList;
MediaPlayer player;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_words_view);
Toast.makeText(WordsViewActivity.this,
"左划下一个单词\n右划上一个单词\n上划退出", Toast.LENGTH_LONG).show();
player = new MediaPlayer();
player = MediaPlayer.create(WordsViewActivity.this, R.raw.turnpage);
wordsViewActivity = findViewById(R.id.wordsViewAtivity);
wordsViewActivity.setOnTouchListener(new OnTouch());
Bundle getMusicInfo = this.getIntent().getExtras();
index = Integer.parseInt(getMusicInfo.getString("index"));
wordsList = getMusicInfo.getStringArray("wordsList");
wordIndex = findViewById(R.id.wordIndex);
wordView = findViewById(R.id.wordView);
setWordView();
}
public void setWordView() {
turnPage();
wordIndex.setText(String.valueOf(index+1)+
" / "+String.valueOf(wordsList.length-1));
String str = wordsList[index];
wordView.setText(str.substring(0,str.indexOf("&&&"))+
"\n\n"+str.substring(str.indexOf("&&&")+3));
}
public void nextWord() {
index = (index + 1) % (wordsList.length - 1);
setWordView();
}
public void prevWord() {
index = (index - 2 + wordsList.length) % (wordsList.length - 1);
setWordView();
}
public void turnPage() {
try {
player.start();
} catch (Exception e) {}
}
class OnTouch implements View.OnTouchListener {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
oldY = (int) motionEvent.getY();
oldX = (int) motionEvent.getX();
return true;
}
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
newY = (int) motionEvent.getY();
newX = (int) motionEvent.getX();
if (oldY - newY > thresholdY) {
startActivity(new Intent(WordsViewActivity.this, CollectionActivity.class));
return true;
}
if (oldX - newX > thresholdX) {
nextWord();
return true;
}
if (newX - oldX > thresholdX) {
prevWord();
return true;
}
return true;
}
return false;
}
}
- 云词库效果
- 使用框架,让用户可上传单词本中数据至服务器处理后,录入数据库


- 后台代码
<?php
include("conn.php");
$json = file_get_contents("php://input");
$jsonData = json_decode($json, true);
$user = $jsonData['user'];
$words = explode('---', $jsonData['words']);
foreach ($words as $word) {
$tmp = explode('&&&', $word);
$test = ord(substr($word, 0, 1))."<br>";
if (65 <= $test && $test <= 90 || 97 <= $test && $test <= 122) {
$en = $tmp[0];
$cn = $tmp[1];
} else {
$cn = $tmp[0];
$en = $tmp[1];
}
$sql = 'insert into '.$user.' values("'.$cn.'","'.$en.'")';
@mysqli_query($link, $sql);
}
mysqli_close($link);
echo '{"res":"'.$user.'","target":"'.$words[0].'"}';
?>
- Android端呈现

四、不足
不能对单词本进行删改操作。