androidreverse
⑴ Android獲取NFC標簽和NFC十進制16進制ID
<uses-feature
android:name="android.hardware.nfc"
android:required="true"/>
<uses-permission android:name="android.permission.NFC"/>
```
class NfcActivity :BaseActivity() {
private lateinit var imgBack:ImageView
private lateinit var mNfcAdapter:NfcAdapter
private lateinit var mPendingIntent:PendingIntent
//nfc標簽信息
private lateinit var tvNfcTag:TextView
//nfc十進制ID
前行 private lateinit var tvNfcD:TextView
//nfc16進制ID
private lateinit var tvNfcH:TextView
/**
* 啟動Activity
*/
override fun onStart() {
super.onStart()
mNfcAdapter =NfcAdapter.getDefaultAdapter(this)
//一旦截獲NFC消息,就會通過PendingIntent調用窗口
mPendingIntent =PendingIntent.getActivity(this,0,Intent(this,javaClass),0)
}
override fun getLayoutId():Int {
return R.layout.activity_nfc
}
override fun eventBus(event:Any?) {
}
override fun onCreate(savedInstanceState:Bundle?) {
super.onCreate(savedInstanceState)
imgBack =findViewById(R.id.img_nfc_back)
tvNfcD =findViewById(R.id.tv_nfc_d)
tvNfcH =findViewById(R.id.tv_nfc_h)
tvNfcTag =findViewById(R.id.tv_nfc_tag)
imgBack.setOnClickListener {finish() }
}
override fun onResume() {
super.onResume()
//設置處理春陸優於所有其他NFC的處理
mNfcAdapter.enableForegroundDispatch(
this,
mPendingIntent,
null,
null
慧森嘩 )
}
override fun onPause() {
super.onPause()
//恢復默認狀態
mNfcAdapter.disableForegroundDispatch(this)
}
override fun onNewIntent(intent:Intent?) {
super.onNewIntent(intent)
// readFromTag(intent);
readNfcTag(intent!!)
}
/**
* 讀取NFC標簽文本數據
*/
private fun readNfcTag(intent:Intent) {
val tag:Tag? =intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
if (tag !=null) {
val cardNo =flipHexStr(ByteArrayToHexString(tag.id)).toLong(16)
tvNfcD.text = cardNo.toString()
tvNfcH.text =ByteArrayToHexString(tag.id)
}
if (NfcAdapter.ACTION_NDEF_DISCOVERED ==intent.action) {
val rawMessages =intent.getParcelableArrayExtra(
NfcAdapter.EXTRA_NDEF_MESSAGES
)
var msgs:Array? =null
var contentSize =0
if (rawMessages !=null) {
msgs =arrayOfNulls(rawMessages.size)
for (iin rawMessages.indices) {
msgs[i] = rawMessages[i]as NdefMessage
contentSize +=msgs[i]!!.toByteArray().size
}
}
try {
if (null !=msgs) {
val record =msgs[0]!!.records[0]
val textRecord:String? =
NfcUtil.parseTextRecord(record)
Log.e("nfcTag-->","" + textRecord)
tvNfcTag.text = textRecord
}
}catch (e:Exception) {
e.printStackTrace()
Log.e("nfcError-->","" + e)
}
}
}
}
```
獲取標簽及其ID的工具類
import android.nfc.NdefRecord;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
public class NfcUtil {
/**
* 解析NDEF文本數據,從第三個位元組開始,後面的文本數據
* @param ndefRecord
* @return
*/
public static String parseTextRecord(NdefRecord ndefRecord) {
/**
* 判斷數據是否為NDEF格式
* 判斷TNF
*/
if (ndefRecord.getTnf() !=NdefRecord.TNF_WELL_KNOWN) {
return null;
}
//判斷可變的長度的類型
if (!Arrays.equals(ndefRecord.getType(),NdefRecord.RTD_TEXT)) {
return null;
}
try {
//獲得位元組數組,然後進行分析
byte[] payload =ndefRecord.getPayload();
//下面開始NDEF文本數據第一個位元組,狀態位元組
//判斷文本是基於UTF-8還是UTF-16的,取第一個位元組"位與"上16進制的80,16進制的80也就是最高位是1,
//其他位都是0,所以進行"位與"運算後就會保留最高位
String textEncoding = ((payload[0] &0x80) ==0) ?"UTF-8" :"UTF-16";
//3f最高兩位是0,第六位是1,所以進行"位與"運算後獲得第六位
int languageCodeLength = payload[0] &0x3f;
//下面開始NDEF文本數據第二個位元組,語言編碼
//獲得語言編碼
String languageCode =new String(payload,1, languageCodeLength,StandardCharsets.US_ASCII);
//下面開始NDEF文本數據後面的位元組,解析出文本
String textRecord =new String(payload, languageCodeLength +1,
payload.length - languageCodeLength -1, textEncoding);
return textRecord;
}catch (Exception e) {
throw new IllegalArgumentException();
}
}
// 16轉10進制
public static String flipHexStr(String s) {
StringBuilder result =new StringBuilder();
for (int i =0; i <=s.length() -2; i = i +2) {
result.append(new StringBuilder(s.substring(i, i +2)).reverse());
}
return result.reverse().toString();
}
public static String ByteArrayToHexString(byte[]inarray) {
int i, j, in;
String[] hex = {"0","1","2","3","4","5","6","7","8","9","A",
"B","C","D","E","F"};
StringBuilder out =new StringBuilder();
for (j =0; j
in = (int)inarray[j] &0xff;
i = (in >>4) &0x0f;
out.append(hex[i]);
i = in &0x0f;
out.append(hex[i]);
}
return out.toString();
}
}
⑵ 如何使用Android的VectorDrawable類繪制矢量圖
1. 創建Vector Drawable
從相似角度來看,VectorDrawable與標准SVG圖形都是利用path值繪制完成的。不過如何利用SVG path繪制圖形並不在本篇文章的探討范圍之內,大家可以點擊此處從W3C網站處獲取必要的說明資料。在本文當中,我們只需要了解到path標簽的作用是進行圖形繪制即可。讓我們首先從SVG文件入手,看看以下圖形是如亂陪閉何被繪制出來的:
這一圖形共由五個主要部分所組成:
一個圓角四邊形作為CPU主體,該四邊形由兩條拱狀弧線構成。
四組各自包含五根線條的圖形,用於充當CPU的外延線路。
雖然看起來有點繁雜,但大家其實用不著糾結於以上代碼的具體含義,而且這完全不會影響到我們接下來要進行的VectorDrawable繪制工作。不過需要強調的是,我將前面提到的五大圖形組成部分在代碼中作為獨立的區塊來處理,這是為了增強代碼內容的可讀性。
首先,我們需要利用兩條拱形弧線來繪制出圓角四邊形,而在接下來的內容中我們會探討如何分別表現出上、下、左、右四個方位的外延線條。為了將上述SVG代碼轉化為VectorDrawable,大家首先需要在XML當中定義vector對象。以下代碼提取自本篇文章示例代碼當中的vector_drawable_cpu.xml文件。
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="64dp" android:width="64dp" android:viewportHeight="600" android:viewportWidth="600" > </vector>
在此之後,大家可以向其中添加path數據。下列代碼同樣被拆分成了五個不同的path標簽而非將其作為整體處理,這當然也是為了保證內容的可讀性。
正如大家所見,每個path片段都只需要利用pathData屬性進行繪制。現在我們可以將VectorDrawable XML文件作為一個可繪制對象納入到標准ImageView當中,而且其能夠根據應用程序的實際需要任意進行尺寸縮放——完全不需要再修改任何Java代碼。
2. 為Vector Drawables添加動畫效果
現在我們已經了解了如何以純代碼方式創建圖形,接下來要做的是找點樂子——為其添加動畫效果。在以下動畫中,大家會發現作為延伸線路的各組線條會不斷指向並遠離CPU本體進行移動。
為了達到這一目標,大家需要將包含動畫效果的每個片段包含在一個<group>嘩裂標簽當中。
接下來,我們需要為每個動畫類型創建animator文件。在本次示例中,每組線路各使用一個animator,這就意味著共需要四個animator。以下代碼所示為亂握上方線路的動畫效果,大家還需要為下、左、右線路設定類似的效果。每個animator XML文件都被包含在了本項目的示例代碼當中。
如大家所見,propertyName被設定為translateY,這意味著該動畫將沿Y軸方向移動。而valueFrom與valueTo則控制著位移的起點與終點。通過將repeatMode設置為reverse而repeatCount設置為infinite,整個動畫會一直循環下去,其效果則在VectorDrawable處體現出來。該動畫的ration被設定為250,其時長單位為毫秒。
為了將該動畫應用到自己的可繪制文件當中,大家需要創建一個新的animated-vector XML文件,從而將這些animator分配給各VectorDrawable組。以下代碼的作用是創建該animated_cpu.xml文件。
<?xml version="1.0" encoding="utf-8"?> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/vector_drawable_cpu"> <target android:animation="@animator/pulse_top" android:name="top" /> <target android:animation="@animator/pulse_right" android:name="right" /> <target android:animation="@animator/pulse_left" android:name="left" /> <target android:animation="@animator/pulse_bottom" android:name="bottom" /> </animated-vector>
當所有必要的XML文件都已經准備完成後,大家就可以將animated_cpu.xml加入到ImageView當中進行顯示了。
<ImageView android:id="@+id/cpu" android:layout_width="64dp" android:layout_height="64dp" android:src="@drawable/animated_cpu" />
要開始播放動畫效果,大家需要從ImageView當中獲取Animatable實例並調用start。
ImageView mCpuImageView = (ImageView) findViewById( R.id.cpu ); Drawable drawable = mCpuImageView.getDrawable(); if (drawable instanceof Animatable) { ((Animatable) drawable).start(); }
在start被調用之後,CPU圖形當中的線路圖形就會開始移動——整個過程只需要使用少量Java代碼即可實現。
3. Vector Drawables的變化方式
對於VectorDrawable來說,最常見的一種使用方式就是將一個圖形轉化至另一個圖形,例如操作欄中的圖標由漢堡變成箭頭。要做到這一點,源與目標path二者都必須具備同樣的格式以保證元素數量上的一致。在本次示例中,我們將如前文圖片所示嘗試將左箭頭轉化為右箭頭。
<string name="left_arrow">M300,70 l 0,70 -70,-70 0,0 70,-70z</string> <string name="right_arrow">M300,70 l 0,-70 70,70 0,0 -70,70z</string>
接下來,大家需要利用path為left_arrow建立一個初始drawable。在示例代碼中,我們將其命名為vector_drawable_left_arrow.xml。
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="64dp" android:width="64dp" android:viewportHeight="600" android:viewportWidth="600" > <path android:name="left_arrow" android:fillColor="#000000" android:pathData="@string/left_arrow"/> /vector>
CPU動畫與這里提到的圖形變化示例之間,最主要的區別就體現在animator_left_right_arrow.xml文件當中。
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:ration="1000" android:propertyName="pathData" android:valueFrom="@string/left_arrow" android:valueTo="@string/right_arrow" android:valueType="pathType" android:repeatMode="reverse" android:repeatCount="-1"/> </set>
大家可能已經注意到了,valueFrom與valueTo兩項屬性會引用左箭頭與右箭頭的path數據,valueType被設定為pathType而propertyName則被設定為pathData。當以上設定完成之後,該animator將明確如何將一組path數據轉化為另一組。當該animator結束之後,我們還需要利用新的animated-vector對象將VectorDrawable分配至objectAnimator。
<?xml version="1.0" encoding="utf-8"?> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/vector_drawable_left_arrow"> <target android:name="left_arrow" android:animation="@animator/animator_left_right_arrows" /> </animated-vector>
最後,大家還需要將該動畫drawable分配至ImageView,而後在自己的Java代碼中開始運行。
<ImageView
android:id="@+id/left_right_arrow"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_below="@+id/cpu"
android:src="@drawable/animated_arrow" />
mArrowImageView = (ImageView) findViewById( R.id.left_right_arrow );
drawable = mArrowImageView.getDrawable();
if (drawable instanceof Animatable) {
((Animatable) drawable).start();
}
⑶ android:screenOrientation的說明
// android:screenOrientation="unspecified"
// android:screenOrientation="landscape"
// android:screenOrientation="portrait"
// android:screenOrientation="user"
// android:screenOrientation="behind"
// android:screenOrientation="sensor"
// android:screenOrientation="nosensor"
// android:screenOrientation="sensorLandscape"
// android:screenOrientation="sensorPortrait"
// android:screenOrientation="reverseLandscape"
// android:screenOrientation="reversePortrait"
// android:screenOrientation="fullSensor"
## 第二種方式:在Activity中設置或者通過mActivity = pActivity來設置,如果在本Activity中設置可使用##
// 如:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT),這方法中省略了this;
// 如果在其它地方,可以使用形如:mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
"unspecified"默認值,由系統來選擇方向。它的使用策略,以及由於選擇時特定的上下文環境,可能會因為設備的差異而不同。
"user"使用用戶當前首選的方向。
"behind"使用Activity堆棧中與該Activity之下的那個Activity的相同的方向。
"landscape"橫向顯示(寬度比高度要大)
"portrait"縱向顯示(高度比寬度要大)
"reverseLandscape"與正常的橫向方向相反顯示,在API Level 9中被引入。
"reversePortrait"與正常的縱向方向相反顯示,在API Level 9中被引入。
"sensorLandscape"橫向顯示,但是基於設備感測器,既可以是按正常方向顯示,也可以反向顯示,在API Level 9中被引入。
"sensorPortrait"縱向顯示,但是基於設備感測器,既可以是按正常方向顯示,也可以反向顯示,在API Level 9中被引入。
"sensor"顯示的方向是由設備的方向感測器來決定的。顯示方向依賴與用戶怎樣持有設備;當用戶旋轉設備時,顯示的方向會改變。但是,滾譽寬默認情況下,有些設備不會在所有的四個方向上都旋轉,因此要允許在所有的四個方向上都能旋轉,就要使用fullSensor屬性值。
"fullSensor"顯示的方向(4個方向)是由設備的方向感測器來決定的,除了它允許屏幕有虛譽4個顯示方向之外,其他與設置為「sensor」時情況類似,不管大亮什麼樣的設備,通常都會這么做。例如,某些設備通常不使用縱向倒轉或橫向反轉,但是使用這個設置,還是會發生這樣的反轉。這個值在API Level 9中引入。
"nosensor"屏幕的顯示方向不會參照物理方向感測器。感測器會被忽略,所以顯示不會因用戶移動設備而旋轉。除了這個差別之外,系統會使用與「unspecified」設置相同的策略來旋轉屏幕的方向。
注意:在給這個屬性設置的值是「landscape」或portrait的時候,要考慮硬體對Activity運行的方向要求。正因如此,這些聲明的值能夠被諸如Google Play這樣的服務所過濾,以便應用程序只能適用於那些支持Activity所要求的方向的設備。例如,如果聲明了「landscape」、「reverseLandscape」、或「sensorLandscape」,那麼應用程序就只能適用於那些支持橫向顯示的設備。但是,還應該使用<uses-feature>元素來明確的聲明應用程序所有的屏幕方向是縱向的還是橫行的。例如:<uses-feature android:name=」android.hardware.screen.portrait」/>。這個設置由Google Play提供的純粹的過濾行為,並且在設備僅支持某個特定的方向時,平台本身並不控制應用程序是否能夠被按照。
⑷ android 反地理編碼問題
剛好之前的項目用到這個問題了,貼下之前的代碼,滲廳大希望能幫助到您,謝謝。
這個方伏仔法就是根據經緯度得到地理信息的方法。
GeoCoder geocoder = GeoCoder.newInstance();
geocoder.reverseGeoCode(new
ReverseGeoCodeOption().location(mCenterLatLng));
geocoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener()
{
@Override
public void
onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
//ToastUtil.showToast(geoCodeResult.getAddress());
}
@Override
public void
onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
//
ToastUtil.showToast(reverseGeoCodeResult.getAddress());
//將實時的反地理編碼信息設置到前台UI控制項進行叢豎顯示
if
(reverseGeoCodeResult.getAddress() != null ||
!reverseGeoCodeResult.getAddress().equals("")) {
address.setText(reverseGeoCodeResult.getAddress());
} else {
address.setHint("定位失敗,請重試或手動輸入地址");
}
}
});
⑸ android 反編譯後的apk的清單文件在哪個文件夾下
使用工具包中的android-reverse-trinea\apktool-1.5.2-windows或下載最新的apktool(需同時下載apktool及對應平台的依賴包,解壓後將平台依賴包中的apktool.jar復制到apktool目錄下),在命令行運行
apktool.bat
d
-f
xxx.apk
xxx
其中d表示解包,xxx.apk為待反編譯apk路徑,xxx為目標文件夾名,(apktool不支持中文目錄),結果會再apktool.bat所在目錄下生成weixin文件夾,現在就可以正確的查看xml資源(包括res下的所有資源,如點9圖片、drawable、layout、value、menu等等)了,比如AndroidManifest.xml
⑹ android:ffmpeg命令-視頻反序播放
命令:
ffmpeg -i %s 輸入好缺視頻友搏辯文件,
-filter_complex [0:v]reverse[v] 處理第一個視頻文件,做反序,操作命名為v,
-map [v] 復雜輸出v文件銀謹,
%s 輸出文件名。
⑺ 安卓手機如何用usb連接電腦上網
安卓手機連接電腦上網已經不是什麼新鮮的事了,很多朋友都會將家用的電腦,通過隨著WiFi或者筆記本設置WiFi共享,讓電腦附近的.智能手機可以連接電腦共享WiFi無線網路免費上網。我為大家帶來的是安卓手機usb連接電腦上網方法,歡迎大家參考閱讀!
安卓手機usb連接電腦上網注意事項:
●電腦必須可以上網;
●安卓手機連接電腦前,請先開啟USB調試模式;
●安卓手機需要已經ROOT許可權,並且已經在電腦中安裝了手機驅動(一般使用過豌豆莢、360手機助手後,一般都已經安裝好了,初次連接某台電腦,可以藉助手機助手先安裝驅動);
安卓手機usb連接電腦上網設置教程
一、首先需要下載安裝usb無線上網工具,名稱為【Android Reverse Tethering】(裡麵包含安卓手機工具和PC工具),大家可以網路搜索一下,選擇中文版下載;
二、將安卓手機通過USB數據線與電腦連接,放了防止連接失敗,連接前,請將電腦中已經開啟的豌豆莢等手機助手工具關閉;
三、將下載工具中的Tracetool service.apk安裝至安卓手機,運行後點擊「Ip Tables」按鈕,在彈出的對話框中允許軟體獲取Root許可權,如下圖所示。
四、在電腦中運行壓縮包里的AndroidTool.exe,先點擊「Refresh」按鈕獲取設備ID,再點擊「Check DNS」自動獲得DNS,最後點擊「Connect」按鈕後,你的手機就能通過USB共享PC的有線網路了,如下圖所示。
進行以上幾步操作,您的安卓手機就可以通過USB連接電腦免費上網了,您可以關於移動網路,然後使用手機打開電腦百事網手機版m.pc841.com看看是否可以免費上網了。
注意事項 :
如果運行AndroidTool.exe後無法找到設備ID或DNS,請嘗試以下三種解決思路:斷開USB線並再重復操作一次;檢查「計算機管理→服務和應用程序→服務」中的ICS共享服務、DHCP服務和Windows Firewall服務,如果被禁用請手動開啟這幾項服務;打開任務管理器,將「adb.exe」任務強制關閉。
以上就是安卓手機usb連接電腦上網教程,希望對大家有所幫助,對於沒有WiFi網路的朋友來說,這種手機USB連接電腦上網,也是不錯的免費上網方式。
⑻ android開發中如何旋轉布局
樓主你好,這個可以通過動畫來達到這個效果的,代碼如下:
只要把您的layout對象傳進去就行了
public void showAnimation(View mView)
{
final float centerX = mView.getWidth() / 2.0f;
final float centerY = mView.getHeight() / 2.0f;
//這個是設置需要旋轉的角度,我設置的是180度
RotateAnimation rotateAnimation = new RotateAnimation(0, 180, centerX,
centerY);
//這個是設置通話時間的
rotateAnimation.setDuration(1000*3);
rotateAnimation.setFillAfter(true);
mView.startAnimation(rotateAnimation);
}
⑼ 手機如何上網不用流量
1、第一步:准備一部安卓灶歲手機、一台電腦、一根數據線。2、第二步:下載一個軟體,軟體名叫AndroidReverseTethering,為USB數據線上網使用。3、第三步:讓安卓手機獲取root的許可權。4、第四步:在電腦上安裝USB驅動,可以使用一些軟體輔助完成USB驅動的完成。5、第五步:開啟安卓手機的USB調試模式。方法是薯旅:首先點擊設置,然後選擇數辯凳應用程序接著點擊開發選項,然後選擇USB調試即可。6、第六步:對zip安裝包進行壓縮並進行操作,然後手機安裝Tracetoolservice.apk。7、第七步:USB數據線將手機和電腦相連接。運行Usbtunnel軟體,記得要獲取root許可權。8、第八步:在電腦中找到經過解壓的目錄文件ReverseTethering打開其中的一個文件名叫AndroidTool.exe的文件。9、第九步:然後進行更新操作,你的安卓手機的地址就會出現在其中。如果沒有出現安卓手機的地址,就再次進行USB調試操作。這樣就完成了整個安裝過程,你的手機就可以通過USB數據線上網了。以上就是除了連接wifi,手機上網不用流量的方法,有需要的小夥伴可以了解一下的。KaoJiaZhao.Com