apk代码混淆保护4.0
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
# Project target.
target=android-17
如果有报异常,例如这样,
java.io.IOException: Please correct the above warnings first.
at proguard.Initializer.execute(Initializer.java:308)
at proguard.ProGuard.initialize(ProGuard.java:210)
at proguard.ProGuard.execute(ProGuard.java:85)
at proguard.ProGuard.main(ProGuard.java:499)
这是由于第三方jar包的原因哦,
你可以这样,
${sdk.dir}\tools\proguard\proguard-android.txt中加入
-dontwarn com.aa.bb.*
-keep class com.aa.bb.*{ *;}
Java 中.class文件保护
http://blog.sina.com.cn/s/blog_6dc41baf01010khy.html
判断指定的服务是否运行:
public static boolean isServiceRunning(Context ctx, String serviceName, String processName) { ActivityManager manager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE); for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if (serviceName.equals(service.service.getClassName()) && processName.equals(service.process)) return true; } return false; }
public static boolean isProcessRunning(Context ctx, String name) { ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> apps = am.getRunningAppProcesses(); for (RunningAppProcessInfo app : apps) { if (app.processName.equals(name)) { return true; } } return false; }
/** * 汉字转换为拼音 * @author Administrator * */ public class HanZiToPinYinUtil { public static String toPinYin(String str) { String py = ""; String[] t = new String[str.length()]; char [] hanzi=new char[str.length()]; for(int i=0;i<str.length();i++){ hanzi[i]=str.charAt(i); } net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat t1 = new HanyuPinyinOutputFormat(); t1.setCaseType(HanyuPinyinCaseType.LOWERCASE); t1.setToneType(HanyuPinyinToneType.WITHOUT_TONE); t1.setVCharType(HanyuPinyinVCharType.WITH_V); try { for (int i = 0; i < str.length(); i++) { if ((str.charAt(i) >= 'a' && str.charAt(i) < 'z') || (str.charAt(i) >= 'A' && str.charAt(i) <= 'Z') || (str.charAt(i) >= '0' && str.charAt(i) <= '9')) { py += str.charAt(i); } else { t = PinyinHelper.toHanyuPinyinStringArray(hanzi[i], t1); py=py+t[0]; } } } catch (BadHanyuPinyinOutputFormatCombination e) { e.printStackTrace(); } return py.trim().toString(); } public static void main(String args[]){ System.out.println(HanZiToPinYinUtil.toPinYin("我屮艸芔茻")); }
boolean isEnabled = Settings.System.getInt( paramContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1; if(isEnabled==true) { Settings.System.putInt( paramContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1); // Post an intent to reload Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", !isEnabled); paramContext.sendBroadcast(intent); } else { Settings.System.putInt( paramContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1); // Post an intent to reload Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); intent.putExtra("state", !isEnabled); paramContext.sendBroadcast(intent); } <uses-permission android:name="android.permission.WRITE_SETTINGS"/> <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
开机自启动:(注意:app一定要安装到内存中,在sd卡上无法自启动)
<receiver android:name="com.pioneersoft.aoc.ui.BootBroadcastReceiver" android:enabled="true" android:exported="true"> <intent-filter > <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.HOME" /> </intent-filter> </receiver>
public class BootBroadcastReceiver extends BroadcastReceiver { // static final String action_boot="android.intent.action.BOOT_COMPLETED"; @Override public void onReceive(Context context, Intent intent) { // if (intent.getAction().equals(action_boot)){ Intent bootStartIntent=new Intent(context,MainActivity.class); bootStartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(bootStartIntent); // } } }
获取未安装apk信息:
/** 获取未安装的APK信息 * @param context * @param archiveFilePath APK文件的路径。如:/sdcard /download/XX.apk */ public void getUninatllApkInfo(Context context, String archiveFilePath){ PackageManager pm = context.getPackageManager(); PackageInfo info = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES); if(info != null){ ApplicationInfo appInfo = info.applicationInfo; String appName = pm.getApplicationLabel(appInfo).toString(); String packageName = appInfo.packageName; Drawable icon = pm.getApplicationIcon(appInfo); } }
监听apk安装,卸载,替换行为:
private void registerIntentReceivers() { IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); filter.addAction(Intent.ACTION_PACKAGE_REMOVED); filter.addAction(Intent.ACTION_PACKAGE_CHANGED); filter.addAction(Intent.ACTION_PACKAGE_REPLACED); filter.addDataScheme("package"); registerReceiver(mApplicationsReceiver, filter); } /** * Receives notifications when applications are added/removed. */ private class ApplicationsIntentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // PackageManager manager = context.getPackageManager(); if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) { String packageName = intent.getData().getSchemeSpecificPart(); Toast.makeText(context, "安装成功"+packageName, Toast.LENGTH_LONG).show(); } if (intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)) { String packageName = intent.getData().getSchemeSpecificPart(); Toast.makeText(context, "卸载成功"+packageName, Toast.LENGTH_LONG).show(); } if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) { String packageName = intent.getData().getSchemeSpecificPart(); Toast.makeText(context, "替换成功"+packageName, Toast.LENGTH_LONG).show(); } } }
这样就会完美解析了。
计算网络接收byte[] 字节数组的实际接受内容大小:
public static void main(String[] args) { byte[] bt=new byte[1024]; String msg="helo! you are very nice! have a good time! happy every day!"; byte[] t=msg.getBytes(); for(int i=0;i<t.length;i++){ bt[i]=t[i]; } String message=new String(bt).trim(); System.out.println(" msg= "+message+" len= "+message.length()); }
获取现在正调用的方法名
String methodName = Thread.currentThread().getStackTrace()[1].getMethodName(); String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();
/** * 安装app */ public static void openAPK(File f, Context context) { context.startActivity(getInstallApp(f, context)); } public static Intent getInstallApp(File f, Context context) { Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //设置应用的安装来源,例如谷歌市场 intent.putExtra("android.intent.extra.INSTALLER_PACKAGE_NAME", context.getPackageName()); intent.setAction(android.content.Intent.ACTION_VIEW); /* 设置intent的file */ intent.setDataAndType(Uri.fromFile(f), "application/vnd.android.package-archive"); return intent; } /** * 卸载APP * @param context * @param packageName */ public static void uninstallApp(Context context,String packageName) { Uri packageURI = Uri.parse("package:" + packageName); Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); uninstallIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(uninstallIntent); }
Android屏幕解锁和锁定 //屏幕解锁 KeyguardManager keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE); KeyguardLock keyguardLock = keyguardManager.newKeyguardLock(LOCK_TAG); keyguardLock.disableKeyguard(); //屏幕锁定 keyguardLock.reenableKeyguard(); Android屏幕常亮/点亮 //保持屏幕常亮 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, LOCK_TAG); mWakeLock.acquire(); //释放屏幕常亮锁 if(null != mWakeLock) { mWakeLock.release(); } /** * 判断桌面是否已添加快捷方式 * * @param cx * @param titleName * 快捷方式名称 * @return */ public static boolean hasShortcut(Context cx) { boolean result = false; // 获取当前应用名称 String title = null; try { final PackageManager pm = cx.getPackageManager(); title = pm.getApplicationLabel( pm.getApplicationInfo(cx.getPackageName(), PackageManager.GET_META_DATA)).toString(); } catch (Exception e) { } final String uriStr; if (android.os.Build.VERSION.SDK_INT < 8) { uriStr = "content://com.android.launcher.settings/favorites?notify=true"; } else { uriStr = "content://com.android.launcher2.settings/favorites?notify=true"; } final Uri CONTENT_URI = Uri.parse(uriStr); final Cursor c = cx.getContentResolver().query(CONTENT_URI, null, "title=?", new String[] { title }, null); if (c != null && c.getCount() > 0) { result = true; } return result; } /** * * 为当前应用添加桌面快捷方式 * * @param cx * @param appName * 快捷方式名称 */ public static void addShortcut(Context cx) { Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); Intent shortcutIntent = cx.getPackageManager() .getLaunchIntentForPackage(cx.getPackageName()); shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); // 获取当前应用名称 String title = null; try { final PackageManager pm = cx.getPackageManager(); title = pm.getApplicationLabel( pm.getApplicationInfo(cx.getPackageName(), PackageManager.GET_META_DATA)).toString(); } catch (Exception e) { } // 快捷方式名称 shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, title); // 不允许重复创建(不一定有效) shortcut.putExtra("duplicate", false); // 快捷方式的图标 Parcelable iconResource = Intent.ShortcutIconResource.fromContext(cx, R.drawable.ic_launcher); shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource); cx.sendBroadcast(shortcut); } /*** * 删除当前应用的桌面快捷方式 * * @param cx */ public static void delShortcut(Context cx) { Intent shortcut = new Intent( "com.android.launcher.action.UNINSTALL_SHORTCUT"); // 获取当前应用名称 String title = null; try { final PackageManager pm = cx.getPackageManager(); title = pm.getApplicationLabel( pm.getApplicationInfo(cx.getPackageName(), PackageManager.GET_META_DATA)).toString(); } catch (Exception e) { } // 快捷方式名称 shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, title); Intent shortcutIntent = cx.getPackageManager() .getLaunchIntentForPackage(cx.getPackageName()); shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); cx.sendBroadcast(shortcut); } 相关权限配置 <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
/** * 添加快捷方式到桌面 要点: * 1.给Intent指定action="com.android.launcher.INSTALL_SHORTCUT" * 2.给定义为Intent.EXTRA_SHORTCUT_INENT的Intent设置与安装时一致的action(必须要有) * 3.添加权限:com.android.launcher.permission.INSTALL_SHORTCUT */ private void addShortcutToDesktop() { Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); // 不允许重建 shortcut.putExtra("duplicate", false); // 设置名字 shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,this.getString(R.string.app_name)); // 设置图标 shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,Intent.ShortcutIconResource.fromContext(this, R.drawable.ic_launcher)); // 设置意图和快捷方式关联程序 shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,new Intent(this, this.getClass()).setAction(Intent.ACTION_MAIN)); // 发送广播 sendBroadcast(shortcut); } 方法二: 首先在xml中设置IntentFilter <intent-filter> <action android:name="android.intent.action.CREATE_SHORTCUT" /> </intent-filter> if (Intent.ACTION_CREATE_SHORTCUT.equals(action)) { Intent shortcut = new Intent(Intent.ACTION_CREATE_SHORTCUT); // 不允许重建 shortcut.putExtra("duplicate", false); // 设置名字 shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, this.getString(R.string.app_name)); // 设置图标 shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(this, R.drawable.ic_launcher)); // 设置意图和快捷方式关联的程序 shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(this, this.getClass())); //将结果返回到launcher setResult(RESULT_OK, intent); } 在launcher中我们运行程序就可以将快捷方式创建在桌面上。 由于快捷方式launcher管理的,我们可以通过查看launcher中是否已经有此快捷方式数据,如果有就不在创建 添加权限:<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/> private boolean hasInstallShortcut() { boolean hasInstall = false; final String AUTHORITY = "com.android.launcher.settings"; Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/favorites?notify=true"); Cursor cursor = this.getContentResolver().query(CONTENT_URI, new String[] { "title", "iconResource" }, "title=?", new String[] { this.getString(R.string.app_name) }, null); if (cursor != null && cursor.getCount() > 0) { hasInstall = true; } return hasInstall; }
上传文件到服务器:
HttpURLConnection connection = null; DataOutputStream outputStream = null; DataInputStream inputStream = null; String pathToOurFile = "/data/file_to_send.mp3"; String urlServer = "http://192.168.1.1/handle_upload.php"; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 1*1024*1024; try { FileInputStream fileInputStream = new FileInputStream(new File(pathToOurFile) ); URL url = new URL(urlServer); connection = (HttpURLConnection) url.openConnection(); // Allow Inputs & Outputs. connection.setDoInput(true); connection.setDoOutput(true); connection.setUseCaches(false); // Set HTTP method to POST. connection.setRequestMethod("POST"); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); outputStream = new DataOutputStream( connection.getOutputStream() ); outputStream.writeBytes(twoHyphens + boundary + lineEnd); outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + pathToOurFile +"\"" + lineEnd); outputStream.writeBytes(lineEnd); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); buffer = new byte[bufferSize]; // Read file bytesRead = fileInputStream.read(buffer, 0, bufferSize); while (bytesRead > 0) { outputStream.write(buffer, 0, bufferSize); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); bytesRead = fileInputStream.read(buffer, 0, bufferSize); } outputStream.writeBytes(lineEnd); outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); // Responses from the server (code and message) serverResponseCode = connection.getResponseCode(); serverResponseMessage = connection.getResponseMessage(); fileInputStream.close(); outputStream.flush(); outputStream.close(); } catch (Exception ex) { //Exception handling }
tring usernamePassword = yourUsername + “:” + yourPassword; String encodedUsernamePassword = Base64.encodeToString(usernamePassword.getBytes(), Base64.DEFAULT); connection.setRequestProperty (“Authorization”, “Basic ” + encodedUsernamePassword);
ProgressDialog pdialog = new ProgressDialog(SettingActivity.this,0);
ScrollView 嵌套 ListView GridView问题
public class MyListView extends ListView{ public MyListView(Context context, AttributeSet attrs) { super(context, attrs); } public MyListView(Context context) { super(context); } public MyListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }
设置texview 垂直滚动条
android:focusable="true"
android:focusableInTouchMode="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:scrollbars="vertical"
android:singleLine="false"
设置textview 文字水平自动滚动(跑马灯效果)
<com.example.playpic.MyTextView
android:id="@+id/myTv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textColor="#000000"
android:focusable="true"
android:focusableInTouchMode="true"
android:scrollHorizontally="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
/>
布局文件需添加属性:android:addStatesFromChildren="true"
修改的textview
public class MyTextView extends TextView { public MyTextView(Context context) { super(context); } public MyTextView(Context context, AttributeSet attrs) { super(context, attrs); } public MyTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); } @Override public boolean isFocused() { return true; } } setContentView(R.layout.scrollview1); MyTextView tv=(MyTextView)findViewById(R.id.myTv); tv.setText(str); tv.setMovementMethod(ScrollingMovementMethod.getInstance());
public void insertAll(String databaseName, ArrayList<ContentValues> valuesArr) { SQLiteDatabase db = getWritableDatabase(); db.beginTransaction(); for (ContentValues val : valuesArr) { db.insert(databaseName, null, val); } db.setTransactionSuccessful(); db.endTransaction(); db.close(); }
public long compareDataToNow(String date){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date passDate,nowDate; long diff=-100l,days=-100l; try { passDate = sdf.parse(date); String nowStr=sdf.format(new Date()); nowDate=sdf.parse(nowStr); diff = passDate.getTime() - nowDate.getTime(); days = diff / (1000 * 60 * 60 * 24); System.out.println( "相隔:"+days+"天"); } catch (ParseException e) { e.printStackTrace(); } return diff; }