Ⅰ 如何獲取android系統的字體名稱
在java環境中有一個專門的獲取ttf文件的頭信息的Font類
Font f = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream("seguisym.ttf"));
String name = f.getName();
System.out.println(name);
但是在android環境下,我們無法直接用到該類去解析TTF文件,下面我將附上代碼來解析ttf文件
TTFParser.Java
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
/**
* TTF Font file parser
* <p>
* sample:
* <code><pre>
* File fs = new File("C:\\Windows\\Fonts");
* File[] files = fs.listFiles(new FilenameFilter() {
* public boolean accept(File dir, String name) {
* if (name.endsWith("ttf")){ return true;}
* return false;
* }
* });
* for (File file : files) {
* TTFParser parser = new TTFParser();
* parser.parse(file.getAbsolutePath());
* System.out.println("font name: " + parser.getFontName());
* }
* </pre></code>
* <p/>
* Copyright: Copyright (c) 12-8-6 下午3:51
* <p/>
* Version: 1.0
* <p/>
*/
public class TTFParser {
public static int COPYRIGHT = 0;
public static int FAMILY_NAME = 1;
public static int FONT_SUBFAMILY_NAME = 2;
public static int UNIQUE_FONT_IDENTIFIER = 3;
public static int FULL_FONT_NAME = 4;
public static int VERSION = 5;
public static int POSTSCRIPT_NAME = 6;
public static int TRADEMARK = 7;
public static int MANUFACTURER = 8;
public static int DESIGNER = 9;
public static int DESCRIPTION = 10;
public static int URL_VENDOR = 11;
public static int URL_DESIGNER = 12;
public static int LICENSE_DESCRIPTION = 13;
public static int LICENSE_INFO_URL = 14;
private Map<Integer, String> fontProperties = new HashMap<Integer, String>();
/**
* 獲取ttf font name
* @return
*/
public String getFontName() {
if (fontProperties.containsKey(FULL_FONT_NAME)) {
return fontProperties.get(FULL_FONT_NAME);
} else if (fontProperties.containsKey(FAMILY_NAME)) {
return fontProperties.get(FAMILY_NAME);
} else {
return null;
}
}
/**
* 獲取ttf屬性
* @param nameID 屬性標記,見靜態變數
* @return 屬性值
*/
public String getFontPropertie(int nameID) {
if (fontProperties.containsKey(nameID)) {
return fontProperties.get(nameID);
} else { return null; }
}
/**
* 獲取ttf屬性集合
* @return 屬性集合(MAP)
*/
public Map<Integer, String> getFontProperties() { return fontProperties; }
/**
* 執行解析
* @param fileName ttf文件名
* @throws IOException
*/
public void parse(String fileName) throws IOException {
fontProperties.clear();
RandomAccessFile f = null;
try {
f = new RandomAccessFile(fileName, "r");
parseInner(f);
} finally {
try {
f.close();
}catch (Exception e) {
//ignore;
}
}
}
private void parseInner(RandomAccessFile randomAccessFile) throws IOException {
int majorVersion = randomAccessFile.readShort();
int minorVersion = randomAccessFile.readShort();
int numOfTables = randomAccessFile.readShort();
if (majorVersion != 1 || minorVersion != 0) { return; }
//jump to TableDirectory struct
randomAccessFile.seek(12);
boolean found = false;
byte[] buff = new byte[4];
TbleDirectory tableDirectory = new TableDirectory();
for (int i = 0; i < numOfTables; i++) {
randomAccessFile.read(buff);
tableDirectory.name = new String(buff);
tableDirectory.checkSum = randomAccessFile.readInt();
tableDirectory.offset = randomAccessFile.readInt();
tableDirectory.length = randomAccessFile.readInt();
if ("name".equalsIgnoreCase(tableDirectory.name)) {
found = true;
break;
}else if (tableDirectory.name == null || tableDirectory.name.length() == 0) {
break;
}
}
// not found table of name
if (!found) { return; }
randomAccessFile.seek(tableDirectory.offset);
NameTableHeader nameTableHeader = new NameTableHeader();
nameTableHeader.fSelector = randomAccessFile.readShort();
nameTableHeader.nRCount = randomAccessFile.readShort();
nameTableHeader.storageOffset = randomAccessFile.readShort();
NameRecord nameRecord = new NameRecord();
for (int i = 0; i < nameTableHeader.nRCount; i++) {
nameRecord.platformID = randomAccessFile.readShort();
nameRecord.encodingID = randomAccessFile.readShort();
nameRecord.languageID = randomAccessFile.readShort();
nameRecord.nameID = randomAccessFile.readShort();
nameRecord.stringLength = randomAccessFile.readShort();
nameRecord.stringOffset = randomAccessFile.readShort();
long pos = randomAccessFile.getFilePointer();
byte[] bf = new byte[nameRecord.stringLength];
long vpos = tableDirectory.offset + nameRecord.stringOffset + nameTableHeader.storageOffset;
randomAccessFile.seek(vpos);
randomAccessFile.read(bf);
String temp = new String(bf, Charset.forName("utf-16"));
fontProperties.put(nameRecord.nameID, temp);
randomAccessFile.seek(pos);
}
}
@Override
public String toString() {
return fontProperties.toString();
}
private static class TableDirectory {
String name; //table name
int checkSum; //Check sum
int offset; //Offset from beginning of file
int length; //length of the table in bytes
}
private static class NameTableHeader {
int fSelector; //format selector. Always 0
int nRCount; //Name Records count
int storageOffset; //Offset for strings storage,
}
private static class NameRecord {
int platformID;
int encodingID;
int languageID;
int nameID;
int stringLength;
int stringOffset; //from start of storage area
}
}
Ⅱ Android如何獲得系統(system)許可權
Android中如何修改系統時間(應用程序獲得系統許可權)在android的API中有提供 SystemClock.setCurrentTimeMillis()函數來修改系統時間,可惜無論你怎麼調用這個函數都是沒用的,無論模擬器還是真機,在logcat中總會得到"Unable to open alarm driver: Permission denied ".這個函數需要root許可權或者運行與系統進程中才可以用。 本來以為就沒有辦法在應用程序這一層改系統時間了,後來在網上搜了好久,知道這個目的還是可以達到的。 第一個方法簡單點,不過需要在Android系統源碼的環境下用make來編譯: 1. 在應用程序的AndroidManifest.xml中的manifest節點中加入 android:sharedUserId="android.uid.system"這個屬性。 2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform這一行 3. 使用mm命令來編譯,生成的apk就有修改系統時間的許可權了。 第二個辦法麻煩點,不過不用開虛擬機跑到源碼環境下用make來編譯: 1. 同上,加入android:sharedUserId="android.uid.system"這個屬性。 2. 使用eclipse編譯出apk文件,但是這個apk文件是不能用的。 3. 用壓縮軟體打開apk文件,刪掉META-INF目錄下的CERT.SF和CERT.RSA兩個文件。 4. 使用目標系統的platform密鑰來重新給apk文件簽名。這步比較麻煩, 首先找到密鑰文件,在我的Android源碼目錄中的位置 是"build argetproctsecurity",下面的platform.pk8和platform.x509.pem 兩個文件。 然後用Android提供的Signapk工具來簽名,signapk的源代碼是 在"build oolssignapk"下, 用法為"signapk platform.x509.pem platform.pk8 input.apk output.apk", 文件名最好使用絕對路徑防止找不到,也可以修改源代碼直接使用。 這樣最後得到的apk和第一個方法是一樣的。 最後解釋一下原理,首先加入android:sharedUserId="android.uid.system"這個屬性。通過Shared User id,擁有同一個User id的多個APK可以配置成運行在同一個進程中。那麼把程序的UID配成android.uid.system,也就是要讓程序運行在系統進程中,這樣就有許可權來修改系統時間了。 只是加入UID還不夠,如果這時候安裝APK的話發現無法安裝,提示簽名不符,原因是程序想要運行在系統進程中還要有目標系統的platform key,就是上面第二個方法提到的platform.pk8和platform.x509.pem兩個文件。用這兩個key簽名後apk才真正可以放入系統進程中。第一個方法中加入LOCAL_CERTIFICATE := platform其實就是用這兩個key來簽名。這也有一個問題,就是這樣生成的程序只有在原始的Android系統或者是自己編譯的系統中才可以用,因為這樣的系統才可以拿到 platform.pk8和platform.x509.pem兩個文件。要是別家公司做的Android上連安裝都安裝不了。試試原始的Android 中的key來簽名,程序在模擬器上運行OK,不過放到G3上安裝直接提示"Package ... has no signatures that match those in shared user android.uid.system",這樣也是保護了系統的安全。最最後還說下,這個android:sharedUserId屬性不只可以把apk放到系統進程中,也可以配置多個APK運行在一個進程中,這樣可以共享數據,應該會很有用的。
Ⅲ android如何獲取操作系統名字
如果沒有uname,可以使用busybox uname,結果同樣為Linux
Ⅳ Android 獲取手機廠商、系統版本等信息
原文: https://blog.csdn.net/uyy203/article/details/73276225
在開發中 我們有時候會需要獲取當前手機的系統版本來進行判斷,或者需要獲取一些當前手機的硬體信息。
android.os.Build類中。包括了這樣的一些信息。我們可以直接調用 而不需要添加任何的許可權和方法。
android.os.Build.VERSION_CODES類 中有所有的已公布的Android版本號。全部是Int常亮。可用於與SDK_INT進行比較來判斷當前的系統版本
Ⅳ 如何獲取android系統當前版本
android獲取系統當前版本,可以參考如下代碼:
/**
* 返回當前程序版本名
*/
public static String getAppVersionName(Context context) {
String versionName = "";
try {
// ---get the package info---
PackageManager pm = context.getPackageManager();
PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
versionName = pi.versionName;
versioncode = pi.versionCode;
if (versionName == null || versionName.length() <= 0) {
return "";
}
} catch (Exception e) {
Log.e("VersionInfo", "Exception", e);
}
return versionName;
}
Ⅵ android 代碼如何獲得版本號和版本名稱
其實很簡單,ANDROID系統中有1個Package
Manager,我們將利用它來完成這個任務。
PackageInfo
pkg
=
getPackageManager().getPackageInfo(getApplication().getPackageName(),
0);
String
appName
=
pkg.applicationInfo.loadLabel(getPackageManager()).toString();
String
versionName
=
pkg.versionName;
appName即是ANDROID利用的名稱。versionName即是ANDROID利用當前的版本號,其對應於AndroidManifest.xml文件里的versionName屬性。
Ⅶ Android如何獲取手機型號和操作系統版本
您好,根據您的需求,可以通過以下兩行代碼獲得相關系統屬性: String version_sdk = Build.VERSION.SDK; // 設備SDK版本(Android版本號) String version_release = Build.VERSION.RELEASE; // 設備的系統版本希望能幫到您,還有什麼問題歡迎...
Ⅷ android開發中如何獲取系統版本號
SystemProperties.get("ro.build.display.id", "unKnow") 這樣就返回手機的版本號了
Ⅸ 如何獲得Android設備名稱
我們自己如何來獲取設備名稱 呢?答案如下:
在命令行中輸入「adb shell」
進入shell之後,再輸入「cat /system/build.prop」
其實,設備信息,主要是存放在「/system/build.prop」文件,通過「cat」命令就可以查看了.
下面附上ADB命令的詳細介紹
adb 介紹
adb的全稱為Android Debug Bridge 調試橋,是連接Android手機與PC端的橋梁,通過adb可以管理、操作模擬器和設備,如安裝軟體、系統升級、運行shell命令等。
管理設備
註:android手機、模擬器統一稱為「設備」
adb devices // 顯示連接到計算機的設備
adb get-serialno // 獲取設備的ID和序列號serialNumber
------------------重啟----------------------------------------------
adb reboot // 重啟設備
adb reboot bootloader // 重啟到bootloader,即刷機模式
adb reboot recovery // 重啟到recovery,即恢復模式
------------------發送命令到設備--------------------------------------
adb [-d|-e|-s <serialNumber>] <command>
-d 發送命令給usb連接的設備
-e 發送命令到模擬器設備
-s <serialNumber> 發送命令到指定設備
adb相關
adb kill-server // 終止adb服務進程
adb start-server // 重啟adb服務進程
adb root // 已root許可權重啟adb服務
adb wait-for-device // 在模擬器/設備連接之前把命令轉載在adb的命令器中
獲取設備硬體信息
adb shell cat /sys/class/net/wlan0/address // 獲取mac地址
adb shell cat /proc/cpuinfo // 獲取cpu序列號
管理設備app
aapt d badging <apkfile> // 獲取apk的packagename 和 classname
------------------安裝----------------------------------------------
adb install <apkfile> // 安裝apk
adb install -r <apkfile> // 保留數據和緩存文件,重新安裝apk,
adb install -s <apkfile> // 安裝apk到sd卡
------------------卸載----------------------------------------------
adb uninstall <package> // 卸載app
adb uninstall -k <package> // 卸載app但保留數據和緩存文件
------------------啟動app-------------------------------------------
adb shell am start -n <package_name>/.<activity_class_name> // 啟動應用
------------------查看內存佔用----------------------------------------
adb shell top // 查看設備cpu和內存佔用情況
adb shell top -m 6 // 查看佔用內存前6的app
adb shell top -n 1 // 刷新一次內存信息,然後返回
adb shell procrank // 查詢各進程內存使用情況
adb shell kill [pid] // 殺死一個進程
adb shell ps // 查看進程列表
adb shell ps -x [PID] // 查看指定進程狀態
adb shell service list // 查看後台services信息
adb shell cat /proc/meminfo // 查看當前內存佔用
adb shell cat /proc/iomem // 查看IO內存分區
文件操作
//android中,sdcard代表內置存儲,不同系統中tf卡的設備名可能不同,使用查看adb shell ls mnt查看所有存儲設備名。
adb remount // 將system分區重新掛載為可讀寫分區
adb push <local> <remote> // 從本地復制文件到設備
adb pull <remote> <local> // 從設備復制文件到本地
adb shell ls // 列出目錄下的文件和文件夾,等同於dos中的dir命令
adb shell cd <folder> // 進入文件夾,等同於dos中的cd 命令
adb shell rename path/oldfilename path/newfilename // 重命名文件
adb shell rm /system/avi.apk // 刪除system/avi.apk
adb shell rm -r <folder> // 刪除文件夾及其下面所有文件
adb shell mv path/file newpath/file // 移動文件
adb shell chmod 777 /system/fonts/DroidSansFallback.ttf // 設置文件許可權
adb shell mkdir path/foldelname // 新建文件夾
adb shell cat <file> // 查看文件內容