Android项目打包成jar在另一个项目中使用报错。

changingshow 2014-04-14 02:34:45
1、在一个Android项目中写了一个获取手机号码的方法,然后把这个项目打包成jar
2、在另一个Android项目中导入了这个jar包,使用了获取手机号码的方法,程序停止运行,报错,错误信息如下。
Caused by: java.lang.IllegalStateException: System services not available to Activities before onCreate()
...全文
296 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
changingshow 2014-04-18
  • 打赏
  • 举报
回复
引用 12 楼 smallkonrad 的回复:
由于res不太方便打包到jar中,则我们可以在代码里编写布局和控件什么的,如:

               // 顶层布局
		mainLayout = new RelativeLayout(context);
		RelativeLayout.LayoutParams mainParams = new RelativeLayout.LayoutParams(
				RelativeLayout.LayoutParams.FILL_PARENT,
				RelativeLayout.LayoutParams.FILL_PARENT);
		mainLayout.setBackgroundColor(0xffffffff);
		// 将顶层布局添加至Activity
		addContentView(mainLayout, mainParams);

		// 顶部显示进度条
		mProgressBar = new ProgressBar(context, null,
				android.R.attr.progressBarStyleHorizontal);
		LinearLayout.LayoutParams progressBarParams = new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.FILL_PARENT, UnitUtil.dip2px(context,
						2));
		mProgressBar.setMax(100);
		mProgressBar.setMinimumHeight(UnitUtil.dip2px(context, 2));
		mainLayout.addView(mProgressBar, progressBarParams);

		// 底部显示按钮
		mBottomBarLayout = new LinearLayout(context);
		RelativeLayout.LayoutParams bottomParams = new RelativeLayout.LayoutParams(
				RelativeLayout.LayoutParams.FILL_PARENT, UnitUtil.dip2px(
						context, 45));
		bottomParams.alignWithParent = true;
		bottomParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,
				RelativeLayout.TRUE);
		mBottomBarLayout.setBackgroundColor(0xffececec);
而图片什么的放到assets文件夹使用,如:

               try {
			Bitmap bm = BitmapFactory.decodeStream(context.getAssets().open(
					"a.png"));
			mPreviousImg.setImageBitmap(bm);
		} catch (IOException e) {
			e.printStackTrace();
		}
非常感谢,学到了很多,我要做的广告条是需要自定义一个imageview,然后从网上down图片,然后图片轮播,点击相应的图片跳转到指定的网址即可。
erytbc 2014-04-16
  • 打赏
  • 举报
回复
由于res不太方便打包到jar中,则我们可以在代码里编写布局和控件什么的,如:

               // 顶层布局
		mainLayout = new RelativeLayout(context);
		RelativeLayout.LayoutParams mainParams = new RelativeLayout.LayoutParams(
				RelativeLayout.LayoutParams.FILL_PARENT,
				RelativeLayout.LayoutParams.FILL_PARENT);
		mainLayout.setBackgroundColor(0xffffffff);
		// 将顶层布局添加至Activity
		addContentView(mainLayout, mainParams);

		// 顶部显示进度条
		mProgressBar = new ProgressBar(context, null,
				android.R.attr.progressBarStyleHorizontal);
		LinearLayout.LayoutParams progressBarParams = new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.FILL_PARENT, UnitUtil.dip2px(context,
						2));
		mProgressBar.setMax(100);
		mProgressBar.setMinimumHeight(UnitUtil.dip2px(context, 2));
		mainLayout.addView(mProgressBar, progressBarParams);

		// 底部显示按钮
		mBottomBarLayout = new LinearLayout(context);
		RelativeLayout.LayoutParams bottomParams = new RelativeLayout.LayoutParams(
				RelativeLayout.LayoutParams.FILL_PARENT, UnitUtil.dip2px(
						context, 45));
		bottomParams.alignWithParent = true;
		bottomParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,
				RelativeLayout.TRUE);
		mBottomBarLayout.setBackgroundColor(0xffececec);
而图片什么的放到assets文件夹使用,如:

               try {
			Bitmap bm = BitmapFactory.decodeStream(context.getAssets().open(
					"a.png"));
			mPreviousImg.setImageBitmap(bm);
		} catch (IOException e) {
			e.printStackTrace();
		}
erytbc 2014-04-16
  • 打赏
  • 举报
回复
引用 10 楼 changingshow 的回复:
[quote=引用 8 楼 smallkonrad 的回复:]

public class SIMCardInfo {

	private TelephonyManager telephonyManager;
	public SIMCardInfo(Context context) {
		telephonyManager = (TelephonyManager) context
				.getSystemService(Context.TELEPHONY_SERVICE);
	}

	public String getNativePhoneNumber() {
		String NativePhoneNumber = null;
		try{
			NativePhoneNumber = telephonyManager.getLine1Number();
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		return NativePhoneNumber;
	}
}
主要是将Context context作为参数传进去,调用的时候如下调用即可:

SIMCardInfo siminfo = new SIMCardInfo(MainActivity.this);
String phoneNum = siminfo.getNativePhoneNumber();
如果你上面那个类继承至Activity的话,会报错的.因为您一个类变量的构造函数需要激活系统服务,而这个类变量的实例化是直接在Activity类里面,而不是在OnCreate函数里面,需要放到OnCreate。
如果我想做一个广告条的jar,应该什么思路呢,是不是就要用到资源文件了?[/quote] 如果是banner类型广告比较简单,继承一下RelativeLayout什么的
public class BannerAdView extends RelativeLayout 
然后通过addView把广告(一般是一个html页面放了一个banner,所以用webview)添加进去
WebView web = new CustomWebView(context);
		LayoutParams params = getBannerLayoutParams();
		addView(web, params);
		web.loadUrl(adUrl);
changingshow 2014-04-15
  • 打赏
  • 举报
回复
引用 8 楼 smallkonrad 的回复:

public class SIMCardInfo {

	private TelephonyManager telephonyManager;
	public SIMCardInfo(Context context) {
		telephonyManager = (TelephonyManager) context
				.getSystemService(Context.TELEPHONY_SERVICE);
	}

	public String getNativePhoneNumber() {
		String NativePhoneNumber = null;
		try{
			NativePhoneNumber = telephonyManager.getLine1Number();
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		return NativePhoneNumber;
	}
}
主要是将Context context作为参数传进去,调用的时候如下调用即可:

SIMCardInfo siminfo = new SIMCardInfo(MainActivity.this);
String phoneNum = siminfo.getNativePhoneNumber();
如果你上面那个类继承至Activity的话,会报错的.因为您一个类变量的构造函数需要激活系统服务,而这个类变量的实例化是直接在Activity类里面,而不是在OnCreate函数里面,需要放到OnCreate。
如果我想做一个广告条的jar,应该什么思路呢,是不是就要用到资源文件了?
changingshow 2014-04-15
  • 打赏
  • 举报
回复
引用 8 楼 smallkonrad 的回复:

public class SIMCardInfo {

	private TelephonyManager telephonyManager;
	public SIMCardInfo(Context context) {
		telephonyManager = (TelephonyManager) context
				.getSystemService(Context.TELEPHONY_SERVICE);
	}

	public String getNativePhoneNumber() {
		String NativePhoneNumber = null;
		try{
			NativePhoneNumber = telephonyManager.getLine1Number();
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		return NativePhoneNumber;
	}
}
主要是将Context context作为参数传进去,调用的时候如下调用即可:

SIMCardInfo siminfo = new SIMCardInfo(MainActivity.this);
String phoneNum = siminfo.getNativePhoneNumber();
如果你上面那个类继承至Activity的话,会报错的.因为您一个类变量的构造函数需要激活系统服务,而这个类变量的实例化是直接在Activity类里面,而不是在OnCreate函数里面,需要放到OnCreate。
按着你说的可以了,我还想问一个问题,方便加下qq吗,QQ:574030493
erytbc 2014-04-15
  • 打赏
  • 举报
回复

public class SIMCardInfo {

	private TelephonyManager telephonyManager;
	public SIMCardInfo(Context context) {
		telephonyManager = (TelephonyManager) context
				.getSystemService(Context.TELEPHONY_SERVICE);
	}

	public String getNativePhoneNumber() {
		String NativePhoneNumber = null;
		try{
			NativePhoneNumber = telephonyManager.getLine1Number();
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		return NativePhoneNumber;
	}
}
主要是将Context context作为参数传进去,调用的时候如下调用即可:

SIMCardInfo siminfo = new SIMCardInfo(MainActivity.this);
String phoneNum = siminfo.getNativePhoneNumber();
如果你上面那个类继承至Activity的话,会报错的.因为您一个类变量的构造函数需要激活系统服务,而这个类变量的实例化是直接在Activity类里面,而不是在OnCreate函数里面,需要放到OnCreate。
changingshow 2014-04-15
  • 打赏
  • 举报
回复
引用 6 楼 leehu1987 的回复:
就是你写的公用方法别放在Activity里就行了,随便放在其他的普通的类里面。 public class Utils{ public XXX static getContacts(Context context){ //操作。。 return null; } }
但是我写的这个方法需要集成activity类啊怎么办呢
酒比花香 2014-04-15
  • 打赏
  • 举报
回复
就是你写的公用方法别放在Activity里就行了,随便放在其他的普通的类里面。 public class Utils{ public XXX static getContacts(Context context){ //操作。。 return null; } }
酒比花香 2014-04-15
  • 打赏
  • 举报
回复
changingshow 2014-04-14
  • 打赏
  • 举报
回复
引用 3 楼 leehu1987 的回复:
Activity一般是用于显示UI的,不要用new Activity().getContacts(). 最好是写一个工具类,接受 Context。这样用起来方便。
能不能给我一个简单的小例子啊,研究好久了都不行
酒比花香 2014-04-14
  • 打赏
  • 举报
回复
Activity一般是用于显示UI的,不要用new Activity().getContacts(). 最好是写一个工具类,接受 Context。这样用起来方便。
changingshow 2014-04-14
  • 打赏
  • 举报
回复
引用 1 楼 lxwwd 的回复:
先确认下,你调用的方法是否静态的
必须要静态吗?
lxwwd 2014-04-14
  • 打赏
  • 举报
回复
先确认下,你调用的方法是否静态的

80,371

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧