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