之前寫了一個獲取當前界面獲取UI控件的狀態的app,是一個test app,沒有activity.
1. 動態獲取權限
我們在安裝apk完成之後,經常會見到有彈框提示是否允許訪問存儲空間,還有是否允許獲取聯繫人等。這個就是動態給apk權限。
這個動態權限的給定應該是要依賴於activity的。 因爲我的app沒有activity,所以一直沒法添加成功。具體添加的方法網上有很多。
2.在setting裏面給存儲權限
在setting裏面應用->權限->應用權限管理->權限管理->讀寫手機存儲->選中我要設定權限的app (各家手機略有區別,過程大同小異)。
可以這這裏修改權限的前提是在AndroidManifest.xml裏面添加了下面兩行:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
不然,你會發現在修改應用存儲權限的界面中根本就沒有這個app的。
當然,手動點擊還是比較麻煩了點。想要實現完全自動化,還是有點辦法的:使用uiautomator中的一些接口,可以使用在當前UI界面中獲取到某個特定的控件,然後可以點擊這個控件。
具體做法可以如下:
UiScrollable view = new UiScrollable(new UiSelector().scrollable(true));
UiObject uiautomator = null;
uiautomator = view.getChildByText(new UiSelector()
.className("android.widget.TextView"), "UiAutomator");
uiautomator.click();
上面代碼就是獲取當前可滑動界面中的text="UiAutomator"(我的app的名字)這個node,然後點擊這個控件。
但是最後還是沒有用這個方法,因爲考慮到進入到這個最終修改權限的界面,不能通過am command直接喚起,應該是因爲中間過程需要一些參數,並且不清楚這個參數具體是什麼。所以,倒是可以連續點擊幾次,最終進入這個界面,不過考慮到系統語言可能不同,需要對不同語言進行處理,就比較麻煩了。
3.使用pm command給權限
直接上command:
adb shell pm grant apk_name android.permission.READ_EXTERNAL_STORAGE
adb shell pm grant apk_name android.permission.WRITE_EXTERNAL_STORAGE
command能下成功的前提是在AndroidManifest.xml裏面需要添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
否則,下command的時候回出現:
Package apk_name has not requested permission android.permission.READ_EXTERNAL_STORAGE
你會發現在兩個command下成功之後,setting裏面進去查看對應app的存儲空間的權限,權限是打開的。
4.直接給系統權限-sign apk
首先,在AndroidManifest.xml裏面的packege="xxx"的後面添加如下內容:
android:sharedUserId="android.uid.system"
然後build出apk,對於test app是有兩個apk的。 分別使用下面的command來sign。
java -jar signapk.jar platform.x509.pem platform.pk8 xx.apk xx_signed.apk
上面有設計到兩個key,這個是和平臺有關係的。一般不用平臺會不一樣,所以要在不用平臺使用這個app的話,需要分別sign.
這種做法一般都是最後的做法。畢竟一般的app是不配擁有這麼高的權限、也得不到這麼高的權限的。
綜上,最終使用的是上面使用pm command來給權限的。方便還用。也可以再不同機種中運行。
邁小步,不停步,堅持必有大進步~