使用 Parcelable 创建 Aidl 时出错
Error while creating Aidl using Parcelable
我正在以这种方式创建 AIDL:
我在 AIDL 目录中设置了这 2 个文件:
IMDpcService.aidl:
// IMDpcService.aidl
package amiin.bazouk.application.com.doproject;
import amiin.bazouk.application.com.doproject.MBytes;
interface IMDpcService {
void setResetPassword(MBytes bytes);
}
MBytes.aidl:
package amiin.bazouk.application.com.doproject;
parcelable MBytes;
我在 java 目录中设置了这些 java 类:
MDpcService.java:
package amiin.bazouk.application.com.doproject;
import android.app.Service;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
public class MDpcService extends Service {
private final static String TAG = "Test-Tag";
private Binder mBinder;
@Override
public void onCreate() {
super.onCreate();
mBinder = new MsiDpcServiceImpl(this);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
static class MDpcServiceImpl extends IMsiDpcService.Stub {
private Context mContext;
private DevicePolicyManager mDpm;
private ComponentName cpntName;
public MDpcServiceImpl(Context context) {
mContext = context;
mDpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
cpntName = new ComponentName(context, DeviceOwnerReceiver.class);
}
@Override
public setResetPassword(MBytes bytes){
//do sth
}
}
}
MBytes.java
package amiin.bazouk.application.com.doproject;
import android.os.Parcel;
import android.os.Parcelable;
public class MBytes implements Parcelable {
private byte[] _byte;
public MBytes() {
}
public MBytes(Parcel in) {
readFromParcel(in);
}
public byte[] get_byte() {
return _byte;
}
public void set_byte(byte[] _byte) {
this._byte = _byte;
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(_byte.length);
dest.writeByteArray(_byte);
}
public void readFromParcel(Parcel in) {
_byte = new byte[in.readInt()];
in.readByteArray(_byte);
}
public static final Creator CREATOR = new Creator() {
public MBytes createFromParcel(Parcel in) {
return new MBytes(in);
}
public MBytes[] newArray(int size) {
return new MBytes[size];
}
};
}
但是,我在编译时遇到了这个错误:
Process 'command
'C:\Users\Adrien\AppData\Local\Android\Sdk\build-tools.0.3\aidl.exe''
finished with non-zero exit value 1
我错过了什么?
在源代码中看到两个问题,以下发现可能会有所帮助。
1.在 IMDpcService.aidl:, 你需要提到方向标签(in or out or 输入输出)
这表明数据的去向。
void setResetPassword(in MBytes bytes);
方向标志说明。
- in - 对象从客户端传输到服务仅用于输入
- out - 对象从客户端传输到仅使用的服务
对于输出。
- inout - 对象从客户端传输到用于输入和输出的服务。
2。在 MBytes.java,在 CREATOR 中指定类型 MBytes,
public static final Creator<MBytes> CREATOR
= new Parcelable.Creator<MBytes>() {
public MBytes createFromParcel(Parcel in) {
return new MBytes(in);
}
public MBytes[] newArray(int size) {
return new MBytes[size];
}
};
参考:Directional tag explanation
我正在以这种方式创建 AIDL:
我在 AIDL 目录中设置了这 2 个文件:
IMDpcService.aidl:
// IMDpcService.aidl
package amiin.bazouk.application.com.doproject;
import amiin.bazouk.application.com.doproject.MBytes;
interface IMDpcService {
void setResetPassword(MBytes bytes);
}
MBytes.aidl:
package amiin.bazouk.application.com.doproject;
parcelable MBytes;
我在 java 目录中设置了这些 java 类:
MDpcService.java:
package amiin.bazouk.application.com.doproject;
import android.app.Service;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
public class MDpcService extends Service {
private final static String TAG = "Test-Tag";
private Binder mBinder;
@Override
public void onCreate() {
super.onCreate();
mBinder = new MsiDpcServiceImpl(this);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
static class MDpcServiceImpl extends IMsiDpcService.Stub {
private Context mContext;
private DevicePolicyManager mDpm;
private ComponentName cpntName;
public MDpcServiceImpl(Context context) {
mContext = context;
mDpm = (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
cpntName = new ComponentName(context, DeviceOwnerReceiver.class);
}
@Override
public setResetPassword(MBytes bytes){
//do sth
}
}
}
MBytes.java
package amiin.bazouk.application.com.doproject;
import android.os.Parcel;
import android.os.Parcelable;
public class MBytes implements Parcelable {
private byte[] _byte;
public MBytes() {
}
public MBytes(Parcel in) {
readFromParcel(in);
}
public byte[] get_byte() {
return _byte;
}
public void set_byte(byte[] _byte) {
this._byte = _byte;
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(_byte.length);
dest.writeByteArray(_byte);
}
public void readFromParcel(Parcel in) {
_byte = new byte[in.readInt()];
in.readByteArray(_byte);
}
public static final Creator CREATOR = new Creator() {
public MBytes createFromParcel(Parcel in) {
return new MBytes(in);
}
public MBytes[] newArray(int size) {
return new MBytes[size];
}
};
}
但是,我在编译时遇到了这个错误:
Process 'command 'C:\Users\Adrien\AppData\Local\Android\Sdk\build-tools.0.3\aidl.exe'' finished with non-zero exit value 1
我错过了什么?
在源代码中看到两个问题,以下发现可能会有所帮助。
1.在 IMDpcService.aidl:, 你需要提到方向标签(in or out or 输入输出) 这表明数据的去向。
void setResetPassword(in MBytes bytes);
方向标志说明。
- in - 对象从客户端传输到服务仅用于输入
- out - 对象从客户端传输到仅使用的服务 对于输出。
- inout - 对象从客户端传输到用于输入和输出的服务。
2。在 MBytes.java,在 CREATOR 中指定类型 MBytes,
public static final Creator<MBytes> CREATOR
= new Parcelable.Creator<MBytes>() {
public MBytes createFromParcel(Parcel in) {
return new MBytes(in);
}
public MBytes[] newArray(int size) {
return new MBytes[size];
}
};
参考:Directional tag explanation