博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
获取Google Advertising ID作为唯一识别码
阅读量:3779 次
发布时间:2019-05-22

本文共 4253 字,大约阅读时间需要 14 分钟。

获取Google Advertising ID作为唯一识别码

在Android程序中,有时候我们APP需要获取唯一识别码,来区别用户。在Android系统中提供了了AndroidId,但AndroidId有时候会为null,同时root手机用户,androidid可以改变。所以AndroidId并不能作为唯一识别码。

对于Google推荐使用Google Advertising ID,通过Google Service可以获取Google Advertising ID(如果没有Google Service就回去不到Google Advertising ID)。下面看看代码吧

AdvertisingIdClient类

public class AdvertisingIdClient {
/** * 这个方法是耗时的,不能在主线程调用 */ public static String getGoogleAdId(Context context) throws Exception { if (Looper.getMainLooper() == Looper.myLooper()) { return "Cannot call in the main thread, You must call in the other thread"; } PackageManager pm = context.getPackageManager(); pm.getPackageInfo("com.android.vending", 0); AdvertisingConnection connection = new AdvertisingConnection(); Intent intent = new Intent( "com.google.android.gms.ads.identifier.service.START"); intent.setPackage("com.google.android.gms"); if (context.bindService(intent, connection, Context.BIND_AUTO_CREATE)) { try { AdvertisingInterface adInterface = new AdvertisingInterface( connection.getBinder()); return adInterface.getId(); } finally { context.unbindService(connection); } } return ""; } private static final class AdvertisingConnection implements ServiceConnection {
boolean retrieved = false; private final LinkedBlockingQueue
queue = new LinkedBlockingQueue<>(1); public void onServiceConnected(ComponentName name, IBinder service) { try { this.queue.put(service); } catch (InterruptedException localInterruptedException) { } } public void onServiceDisconnected(ComponentName name) { } public IBinder getBinder() throws InterruptedException { if (this.retrieved) throw new IllegalStateException(); this.retrieved = true; return this.queue.take(); } } private static final class AdvertisingInterface implements IInterface {
private IBinder binder; public AdvertisingInterface(IBinder pBinder) { binder = pBinder; } public IBinder asBinder() { return binder; } public String getId() throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); String id; try { data.writeInterfaceToken("com.google.android.gms.ads.identifier.internal.IAdvertisingIdService"); binder.transact(1, data, reply, 0); reply.readException(); id = reply.readString(); } finally { reply.recycle(); data.recycle(); } return id; } public boolean isLimitAdTrackingEnabled(boolean paramBoolean) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); boolean limitAdTracking; try { data.writeInterfaceToken("com.google.android.gms.ads.identifier.internal.IAdvertisingIdService"); data.writeInt(paramBoolean ? 1 : 0); binder.transact(2, data, reply, 0); reply.readException(); limitAdTracking = 0 != reply.readInt(); } finally { reply.recycle(); data.recycle(); } return limitAdTracking; } }}

MainActivity类调用

public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Executors.newSingleThreadExecutor().execute(new Runnable() { @Override public void run() { try { String adid = AdvertisingIdClient.getGoogleAdId(getApplicationContext()); Log.e("MainActivity", "adid: " + adid); } catch (Exception e) { e.printStackTrace(); } } }); }}

转载地址:http://resvn.baihongyu.com/

你可能感兴趣的文章
JSON和AJAX
查看>>
web之监听器listener
查看>>
类加载器
查看>>
数据库设计
查看>>
Java虚拟机的内存分配和运行机制(粗谈)
查看>>
web开发之BaseServlet的使用
查看>>
初识Maven
查看>>
Maven分模块构建项目
查看>>
MyBatis初识
查看>>
MyBatis【进阶详解】
查看>>
面试题集锦(七)
查看>>
注解开发——Spring整合dao/service/web
查看>>
架构的演进
查看>>
Elastic-Job的基础使用
查看>>
策略过滤器的灵活性分析
查看>>
POI的使用
查看>>
Anaconda和PyCharm的下载、安装和配置
查看>>
Mockito单元测试简述
查看>>
GUAVA的常用方法汇总
查看>>
装饰器和门面设计模式介绍
查看>>