最近公司的项目需要用到第三方app访问自己的软件获取数据,开始使用内容提供者,后面需要判断哪些app才可以获取,而内容提供者可是所有第三方都允许的。所以只能换了,后面在同事那边知道了AIDL就找了些资料,看了下都是以前的EC版本的,也有一篇AS的。我看了下实现了功能,就放出来当个笔记了。
参考的文章
1.在需要分享出信息的软件里面创建AIDL文件。
之后命令生成一个XXXX.AIDL文件
删掉里面自带的方法。添加自己需要的方法
我添加了两个String的方法 一个用来获取name 一个用来获取pwd
interface GetInformationManager {
String getName(String packname);
String getPwd(String packname);
}
我里面要求传参数 是为了做一些判断而已,用来判断允许哪些第三方软件可以访问我的数据
这之后请clean或者rebuild你的项目,为了让AS生成相对应的JAVA文件
没错之后再进行下一步。
生成的位置如下
2.创建一个自己的服务来实现AIDL的方法
代码:
/**
* Created by Administrator on 2016/11/2.
*/
public class GIMService extends Service{
private final GetInformationManager.Stub manager = new GetInformationManager.Stub() {
@Override
public String getName(String packname) throws RemoteException {
return Tools.username;
}
@Override
public String getPwd(String packname) throws RemoteException {
return Tools.userpwd;
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
return manager;
}
}
由于测试,我就没在get的两个方法里面添加判定。
3.在AndroidManifest.xml文件里面添加服务即可
代码:
至此,自己的软件 设置算是完全完成了。
在下面是 第三方软件需要加入的东西设置了。
1.将自己软件里面新建出来的xxx.AIDL文件拷贝出来,让第三方软件放进自己的软件。
拷贝的话建议是把整个aidl文件夹拷贝到第三方软件内。
放的位置:
拷贝完成后还是需要clean或者rebuild你的项目,为了让AS生成相对应的JAVA文件
没错后就可以进行下一步了。
2.在需要调用的地方开启服务
设置了一个新的test项目在主界面加入了一个按钮
布局图如下
代码如下
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mBound){
startService();
Toast.makeText(MainActivity.this,"服务正在重连",Toast.LENGTH_SHORT).show();
return;
}
if (manager == null) return;
try {
String name = manager.getName("");
String pwd = manager.getPwd("");
Log.e("账号",name);
Log.e("密码",pwd);
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
private void startService(){
Intent intent = new Intent();
intent.setAction("android.intent.action.GIMService");
intent.setPackage("com.ffcs.stb");
bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStart() {
super.onStart();
if (!mBound){
startService();
}
}
@Override
protected void onStop() {
super.onStop();
if (mBound){
unbindService(mServiceConnection);
mBound = false;
}
}
private GetInformationManager manager = null;
//默认未连接服务
private boolean mBound = false;
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
manager = GetInformationManager.Stub.asInterface(service);
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
mBound = false;
}
};
}
至此第三方的项目就可以获取数据了。
运行结果如下:
最后说下注意点吧。
1. 5.0之后隐式Intent 需要设置活动和包名,不然会错误
2. 创建和拷贝.AIDL文件之后需要重建下项目 不然不会生成相应的JAVA文件,导致写服务一直点不出来
3. 还有就是 需要你软件开启之后,第三方软件才可以获取服务从而获取数据
最后是,我直接用项目写的,源码可能就没办法发了!