Android主題開發者做的主題,如果想取代第三方應用程式圖標,就必須知道應用程式的套件名稱。其實想知道應用程式的套件名稱很簡單,直接在瀏覽器開啟Google Play或豌豆莢,打開某應用程式的頁面,看網址你就會發現,網址最後「/」字元後接的就是套用的套件名稱!
估計有人想把常用應用的圖標和包名都搞下來,所以用java寫了個小程序,批量抓取了豌豆莢上“全部軟體”按總下載量排名裡1到20頁的應用圖標與包名。
所有圖示都用套件名稱來命名的,裡面還有一個packageName.txt文件,包含了應用程式名稱對應的套件名稱,方便尋找。
java來源碼
分享這個java小程序,注意,如果豌豆莢的網頁結構變了(估計很少改變吧),這個小程序就需要修改一下了,如果看得懂的話,修改很簡單的咯。
以下程式碼可能失效,僅作參考!
複製代碼代碼如下:
package im.garth.AppIconDownloader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map.Entry;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/**
* 取得豌豆莢網頁上安卓軟體全部軟體
* 注意:執行程式前,一定要在這個工程目錄下建立icon資料夾
* 所有圖示將下載到icon這個資料夾中
* 應用程式名稱與套件名稱寫到了icon下的packageName.txt檔案裡
*
* 這個程式用到的jar包:
* commons-logging-1.1.3.jar
* httpclient-4.1.2.jar
* httpcore-4.3.jar
* jsoup-1.6.1.jar
*
*
*/
public class AppIconDownloader {
/**
* @param args
*/
public static void main(String[] args) {
String rootUrl = "http://www.wandoujia.com/tag/全部軟體/total?page=";
//String rootUrl = "http://www.wandoujia.com/tag/全部遊戲/total?page=";
//下載1到20頁的應用程式圖標
for(int i = 1; i < = 20; i++) {
System.out.println("【下載進度】:準備下載第" + i + "頁");
String currentUrl = rootUrl + i;
HashMap<String, String> apps = new HashMap<string , String>();
apps = getAppImageUrl(currentUrl);
//遍歷HashMap逐一下載圖標
for(Entry</string><string , String> entry : apps.entrySet()) {
try{
//下載圖標,儲存到目前工程目錄下的icon目錄(請事先建立icon目錄)
download(entry.getValue(), "icon/" + entry.getKey() + ".png");
}catch(Exception e) {
System.out.println("【下載出錯】:" + entry.getKey());
e.printStackTrace();
}
}
System.out.println("【下載進度】:第" + i + "頁下載完成");
}
}
/**
* 取得url網頁裡的所有應用程式的應用程式名稱及其圖示網址
* @param appPackageName
* @return
*/
private static HashMap</string><string , String> getAppImageUrl(String url) {
HashMap</string><string , String> apps = new HashMap</string><string , String>();
String appPackageName = "";
String appImageUrl = "";
String appName = "";
String html = getHtmlByUrl(url);
Document doc = Jsoup.parse(html);
Elements elements = doc.select("div.container.clearfix>section.main-col>div.app-blocks>div.app-block>ul.app-list.clearfix>li.app>a.icon-area" );
Elements nameElements = doc.select("div.container.clearfix>section.main-col>div.app-blocks>div.app-block>ul.app-list.clearfix>li.app>div.operate>a. name>span.txt");
Elements imageEle;
int i = 0;
for(Element ele : elements) {
//取得包名
appPackageName = ele.attr("data-pn");
//取得圖示網址
imageEle = ele.select("img.icon");
appImageUrl = imageEle.get(0).attr("src").replace("68_68", "256_256");
//加入apps
apps.put(appPackageName, appImageUrl);
//取得app名稱
appName = nameElements.get(i).text();
//把app名稱和套件名稱輸出到文件
write2file("【" + appName + "】" + appPackageName);
i++;
}
System.out.println("【下載進度】:" + url + "下的圖示網址已經取得成功");
return apps;
}
/**
* 下載檔案到本機
*
* @param urlString
* 被下載的檔案位址
* @param filename
* 本地檔名
* @throws Exception
* 各種異常
*/
private static void download(String urlString, String filename) throws Exception {
System.out.println("【下載進度】:正在下載" + filename);
// 建構URL
URL url = new URL(urlString);
// 開啟連線
URLConnection con = url.openConnection();
// 輸入流
InputStream is = con.getInputStream();
// 1K的資料緩衝
byte[] bs = new byte[1024];
// 讀取到的資料長度
int len;
// 輸出的檔案流
OutputStream os = new FileOutputStream(filename);
// 開始讀取
while ((len = is.read(bs)) != -1) {
os.write(bs, 0, len);
}
// 完畢,關閉所有鏈接
os.close();
is.close();
System.out.println("【下載進度】:" + filename + "下載成功");
}
/**
* 根據URL獲得所有的html信息
* @param url
* @return html
*/
private static String getHtmlByUrl(String url){
String html = null;
//建立httpClient對象
HttpClient httpClient = new DefaultHttpClient();
//以get方式請求該URL
HttpGet httpget = new HttpGet(url);
try {
//得到responce對象
HttpResponse responce = httpClient.execute(httpget);
//回傳碼
int resStatu = responce.getStatusLine().getStatusCode();
//200正常其他就不對
if (resStatu==HttpStatus.SC_OK) {
//取得對應實體
HttpEntity entity = responce.getEntity();
if (entity!=null) {
//獲得html原始碼
html = EntityUtils.toString(entity);
}
}
} catch (Exception e) {
System.out.println("訪問【"+url+"】出現異常!");
e.printStackTrace();
} finally {
httpClient.getConnectionManager().shutdown();
}
return html;
}
private static void write2file(String content) {
File file = new File("icon/packageName.txt");
BufferedWriter writer = null;
try{
if(!file.exists()) {
file.createNewFile();
}
//參數true表示將輸出追加到檔案內容的末端而不覆蓋原來的內容
writer = new BufferedWriter(new FileWriter(file, true));
//輸出內容
writer.write(content);
//換行
writer.newLine();
} catch(IOException e){
System.out.println("輸出出錯");
e.printStackTrace();
} finally {
if( writer != null) {
try {
writer.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
}
}