精华内容
下载资源
问答
  • Android程序制作自己Log日志收集系统

    千次阅读 2018-04-27 11:23:11
    写在前面 在我们的代码中,通常会用try{}catch来捕获能够预料到的一些异常,但是,通常...Java为我们提供了一个机制,用来捕获并处理在一个线程对象中抛出的未检测异常,以避免程序终止。我们可以通过UncaughtExce...

    ###写在前面
    在我们的代码中,通常会用try{}catch来捕获能够预料到的一些异常,但是,通常情况下, 我们的代码都会出现无法预料到异常信息,我们怎样去捕获到这些异常,并上传到自己的服务器来分析修bug呢?
    ###UncaughtExceptionHandler接口
    Java为我们提供了一个机制,用来捕获并处理在一个线程对象中抛出的未检测异常,以避免程序终止。我们可以通过UncaughtExceptionHandler来实现。
    那么怎样使用呢?
    首相,我们需要定义一个类,并实现UncaughtExceptionHandler

    public class CatchExceptionUtil implements UncaughtExceptionHandler {
    	// ......
    }
    

    然后,写一个初始化方法

    public class CatchExceptionUtil implements UncaughtExceptionHandler {
    	/**
    	 * 初始化
    	 * @param context
    	 */
    	public void init(Context context) {
    		mContext = (MyApplication) context;
    		// 获取系统默认的UncaughtException处理器
    		mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
    		// 设置该CrashHandler为程序的默认处理器
    		Thread.setDefaultUncaughtExceptionHandler(this);
    	}
    }
    

    重写uncaughtException方法

    public class CatchExceptionUtil implements UncaughtExceptionHandler {
    	/**
    	 * 初始化
    	 * @param context
    	 */
    	public void init(Context context) {
    		mContext = (MyApplication) context;
    		// 获取系统默认的UncaughtException处理器
    		mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
    		// 设置该CrashHandler为程序的默认处理器
    		Thread.setDefaultUncaughtExceptionHandler(this);
    	}
    
    	/**
    	 * 当UncaughtException发生时会转入该函数来处理
    	 */
    	@Override
    	public void uncaughtException(Thread thread, Throwable ex) {
    		if (!handleException(ex) && mDefaultHandler != null) {
    			// 如果用户没有处理则让系统默认的异常处理器来处理
    			mDefaultHandler.uncaughtException(thread, ex);
    		} else {
    			// 程序出现了异常,通常我们在这里退出,并重新启动应用
    			ToastUtil.showShortToast(mContext,"出现未知异常");
    			forceExit();
    		}
    }
    

    在上面的代码中,我们看到出现了一个很关键的方法,handleException,我们需要在这里去作出自己的处理如上传崩溃信息到服务器,或者存储Log日志到SD卡等
    下面是handleException的方法

    	/**
    	 * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
    	 * 
    	 * @param ex
    	 * @return true:如果处理了该异常信息;否则返回false.
    	 */
    	private boolean handleException(Throwable ex) {
    		if (ex == null) {
    			return false;
    		}
    		// 使用Toast来显示异常信息
    		new Thread() {
    			@Override
    			public void run() {
    				Looper.prepare();
    				Looper.loop();
    			}
    		}.start();
    		// 收集设备参数信息
    		collectDeviceInfo(mContext);
    		// 保存日志文件
    		saveCrashInfo2File(ex);
    		//上传日志信息
    		uploadingLog();
    		return true;
    	}
    

    文末将会贴出这个类的所有方法,下面我们在Application中调用这个类

    		CatchExceptionUtil crashHandler = CatchExceptionUtil.getInstance();//
            crashHandler.init(getApplicationContext());
    

    以下是本类完整的代码

    
    /**
     * @brief 异常崩溃处理类
     * @details 当程序发生未捕获异常时,由该类来接管程序并记录发送错误报告。
     */
    public class CatchExceptionUtil implements UncaughtExceptionHandler {
    
    	public static final String TAG = "CatchExceptionUtil";
    
    	// 系统默认的UncaughtException处理类
    	private UncaughtExceptionHandler mDefaultHandler;
    	// CrashHandler实例
    	private static CatchExceptionUtil INSTANCE = new CatchExceptionUtil();
    	// 程序的Context对象
    	private MyApplication mContext;
    	// 用来存储设备信息和异常信息
    	private Map<String, String> infos = new HashMap<String, String>();
    
    	// 用于格式化日期,作为日志文件名的一部分
    	private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
    
    	private StringBuffer context;
    
    	private String mId;
    
    	/** 保证只有一个CrashHandler实例 */
    	private CatchExceptionUtil() {
    	}
    
    	/** 获取CrashHandler实例 ,单例模式 */
    	public static CatchExceptionUtil getInstance() {
    		return INSTANCE;
    	}
    
    	/**
    	 * 初始化
    	 * 
    	 * @param context
    	 */
    	public void init(Context context) {
    		mContext = (MyApplication) context;
    		// 获取系统默认的UncaughtException处理器
    		mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
    		// 设置该CrashHandler为程序的默认处理器
    		Thread.setDefaultUncaughtExceptionHandler(this);
    	}
    
    	/**
    	 * 当UncaughtException发生时会转入该函数来处理
    	 */
    	@Override
    	public void uncaughtException(Thread thread, Throwable ex) {
    		if (!handleException(ex) && mDefaultHandler != null) {
    			// 如果用户没有处理则让系统默认的异常处理器来处理
    			mDefaultHandler.uncaughtException(thread, ex);
    		} else {
    			// 退出程序
    			ToastUtil.showShortToast(mContext,"出现未知异常");
    //			Intent intent = new Intent(mContext, MainActivity.class);
    //			intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    //			mContext.startActivity(intent);
    			forceExit();
    			//android.os.Process.killProcess(android.os.Process.myPid());
    //			Intent intent = new Intent(mContext.getApplicationContext(), MainActivity.class);
    //			PendingIntent restartIntent = PendingIntent.getActivity(
    //					mContext.getApplicationContext(), 0, intent,
    //					PendingIntent.FLAG_ONE_SHOT);
    //			//退出程序
    //			AlarmManager mgr = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
    //			mgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 0,
    //					restartIntent); // 1秒钟后重启应用
    			//application.finishActivity();
    
    		}
    
    
    	}
    
    	private void forceExit() {
    		MyApplication.getInstance().finishAllActivity();
    		android.os.Process.killProcess(android.os.Process.myPid());
    		System.exit(1);
    	}
    
    	/**
    	 * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
    	 * 
    	 * @param ex
    	 * @return true:如果处理了该异常信息;否则返回false.
    	 */
    	private boolean handleException(Throwable ex) {
    		if (ex == null) {
    			return false;
    		}
    		// 使用Toast来显示异常信息
    		new Thread() {
    			@Override
    			public void run() {
    				Looper.prepare();
    				Looper.loop();
    			}
    		}.start();
    		// 收集设备参数信息
    		collectDeviceInfo(mContext);
    		// 保存日志文件
    		saveCrashInfo2File(ex);
    		//上传日志信息
    		uploadingLog();
    		return true;
    	}
    	
    	/**上传日志信息*/
    	private void uploadingLog() {
    		//需要将参数上传
    		String uid=mContext.getUserEntity().getUserId();
    		String platform="ANDROID";
    		String con = context.toString();
    		String device_mode= Build.MODEL ;
    		String device_id= Build.ID;
    		RequestParams params = new RequestParams(HttpUrlManager.clientcrash());
    		params.addBodyParameter("uid", uid);
    		params.addBodyParameter("platform", platform);
    		params.addBodyParameter("content", con);
    		params.addBodyParameter("device_mode", device_mode);
    		params.addBodyParameter("device_id", device_id);
    		params.addBodyParameter("version", SystemUtil.GetVersionName(mContext));
    		x.http().post(params, new Callback.CommonCallback<String>() {
    			@Override
    			public void onCancelled(CancelledException arg0) {
    			}
    
    			@Override
    			public void onError(Throwable arg0, boolean arg1) {
    				forceExit();
    			}
    
    			@Override
    			public void onFinished() {
    
    			}
    
    			@Override
    			public void onSuccess(String arg0) {
    				forceExit();
    		}
    		});
    	}
    	
    	/**
    	 * 收集设备参数信息
    	 * 
    	 * @param ctx
    	 */
    	public void collectDeviceInfo(Context ctx) {
    		try {
    			PackageManager pm = ctx.getPackageManager();
    			PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(),
    					PackageManager.GET_ACTIVITIES);
    			if (pi != null) {
    				String versionName = pi.versionName == null ? "null" : pi.versionName;
    				String versionCode = pi.versionCode + "";
    				infos.put("versionName", versionName);
    				infos.put("versionCode", versionCode);
    			}
    		} catch (NameNotFoundException e) {
    			Log.e(TAG, "an error occured when collect package info", e);
    		}
    		Field[] fields = Build.class.getDeclaredFields();
    		for (Field field : fields) {
    			try {
    				field.setAccessible(true);
    				infos.put(field.getName(), field.get(null).toString());
    			} catch (Exception e) {
    				Log.e(TAG, "an error occured when collect crash info", e);
    			}
    		}
    	}
    
    	/**
    	 * 保存错误信息到文件中
    	 * 
    	 * @param ex
    	 * @return 返回文件名称,便于将文件传送到服务器
    	 */
    	@SuppressLint("SdCardPath")
    	private String saveCrashInfo2File(Throwable ex) {
    
    		context = new StringBuffer();
    		for (Map.Entry<String, String> entry : infos.entrySet()) {
    			String key = entry.getKey();
    			String value = entry.getValue();
    			if ("ID".equals(key)) {
    				mId = value;
    			}
    			context.append(key + "=" + value + "\n");
    		}
    		
    		
    
    		Writer writer = new StringWriter();
    		PrintWriter printWriter = new PrintWriter(writer);
    		ex.printStackTrace(printWriter);
    		Throwable cause = ex.getCause();
    		while (cause != null) {
    			cause.printStackTrace(printWriter);
    			cause = cause.getCause();
    		}
    		printWriter.close();
    		String result = writer.toString();
    		context.append(result);
    		try {
    			long timestamp = System.currentTimeMillis();
    			String time = formatter.format(new Date());
    			String fileName = "crash-" + time + "-" + timestamp + ".log";
    			if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    				String path = "/sdcard/crash/";
    				File dir = new File(path);
    				if (!dir.exists()) {
    					dir.mkdirs();
    				}
    				FileOutputStream fos = new FileOutputStream(path + fileName);
    				fos.write(context.toString().getBytes());
    				fos.close();
    			}
    			Log.e(TAG, context.toString());
    			return fileName;
    		} catch (Exception e) {
    			Log.e(TAG, "an error occured while writing file...", e);
    		}
    		return null;
    	}
    }
    
    
    展开全文
  • 主要为大家详细介绍了第1个Android应用程序PhonewordApp:Android制作简单单页导航,感兴趣的小伙伴们可以参考一下
  • Tajweed-App 使用 Android Studio 制作的简单 Android 参考应用程序
  • I would like to develop a (rather simple) android app to be distributed via Play Store. I would like to do so completely in python. However, the online research hasn't quite enlightened me: most comme...

    1586010002-jmsa.png

    I would like to develop a (rather simple) android app to be distributed via Play Store. I would like to do so completely in python. However, the online research hasn't quite enlightened me: most comments are either outdated (>1 year old, and I feel there might be better integration of python since then) or they talk about running python in android (e.g. here).

    Therefore, I'm looking for information regarding the questions:

    is it feasible to develop an App completely in python - and what are the tools to do so? (Is e.g. Kivy recommendable?)

    if so: what are the best software environments to implement this? (I unsuccessfully tried using Android Studio but couldn't figure out a way to run python code there.)

    I'm quite new to app development and would highly appreciate any leads of doing this in python rather than in Jave etc., which I don't know yet.

    Many thanks for you help in advance.

    解决方案

    To answer your first question: yes it is feasible to develop an android application in pure python, in order to achieve this I suggest you use BeeWare, which is just a suite of python tools, that work together very well and they enable you to develop platform native applications in python.

    checkout this video by the creator of BeeWare that perfectly explains and demonstrates it's application

    How it works

    Android's preferred language of implementation is Java - so if you want to write an Android application in Python, you need to have a way to run your Python code on a Java Virtual Machine. This is what VOC does. VOC is a transpiler - it takes Python source code, compiles it to CPython Bytecode, and then transpiles that bytecode into Java-compatible bytecode. The end result is that your Python source code files are compiled directly to a Java .class file, which can be packaged into an Android application.

    VOC also allows you to access native Java objects as if they were Python objects, implement Java interfaces with Python classes, and subclass Java classes with Python classes. Using this, you can write an Android application directly against the native Android APIs.

    Once you've written your native Android application, you can use Briefcase to package your Python code as an Android application.

    Briefcase is a tool for converting a Python project into a standalone native application. You can package projects for:

    Mac

    Windows

    Linux

    iPhone/iPad

    Android

    AppleTV

    tvOS.

    You can check This native Android Tic Tac Toe app written in Python, using the BeeWare suite. on GitHub

    in addition to the BeeWare tools, you'll need to have a JDK and Android SDK installed to test run your application.

    and to answer your second question: a good environment can be anything you are comfortable with be it a text editor and a command line, or an IDE, if you're looking for a good python IDE I would suggest you try Pycharm, it has a community edition which is free, and it has a similar environment as android studio, due to to the fact that were made by the same company.

    I hope this has been helpful

    展开全文
  • 包括Android 移动开发基础案例教程课本中第二章实战演练——制作QQ登录界面的源代码,可用Android studio运行,适合初学者学习。
  • 相片注解 Android应用程序制作便签照片
  • Android程序的启动画面制作

    千次阅读 2011-09-10 20:57:49
    参考博客:... 今天晚上,我又做了一下开始没有了解清楚的Android程序的启动画面制作。附件是我的演示程序。 具体分析如下: 不管是哪个工程,只要你创建两个

    参考博客:http://blog.csdn.net/chaijun0613/article/details/6531262


    今天晚上,我又做了一下开始没有了解清楚的Android程序的启动画面制作。附件是我的演示程序。

    具体分析如下:
    不管是哪个工程,只要你创建两个文件splash.xm 和 splash.java Activity 并且在Manifest定义首先启动的是splash.java Activity 。就可以了。然后就是在splash.java文件中写具体的操作了。下面是我的这几个文件的源代码。

    splash.xml:

    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_height="fill_parent" 
      android:layout_width="fill_parent" 
      android:orientation="vertical">
    <ImageView android:layout_height="fill_parent" 
    android:layout_width="fill_parent" 
    android:scaleType="fitCenter" 
    android:src="@drawable/ico1">  这个是获取图片,在res/drawable/下的ico1.png文件
    </ImageView>
    </LinearLayout>

    splash.java:

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.os.Handler;

    public class Splash extends Activity{
    /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.splash);
            Handler x = new Handler();
            x.postDelayed(new splashhandler(), 2000); //延时2秒
            
        }
        class splashhandler implements Runnable{

            public void run() {
                startActivity(new Intent(getApplication(),HelloAndroidActivity.class));  //其中HelloAndroidActivity是你要进入的下一个Activity
                Splash.this.finish(); 
            }
            
        }
    }

    Manifest:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.helloandroid"
          android:versionCode="1"
          android:versionName="1.0">
        <uses-sdk android:minSdkVersion="7" />

        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name=".HelloAndroidActivity"
                      android:label="@string/app_name">
                <intent-filter>
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name="Splash">
             <intent-filter>
                    <action android:name="android.intent.action.MAIN" />   作为主Activity入口
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

        </application>
    </manifest>

    展开全文
  • 安卓项目 制作Android音乐播放器应用程序的基本假期项目
  • 我的应用组合 通过 Udacity android nanodegree 制作的应用程序组合
  • 数独之星 Android Studio制作的Sudoku Star应用程序
  • android程序计算器的制作过程

    千次阅读 2017-06-19 10:42:06
    计算器对于我们来说并不陌生,它是现代人发明的可以进行数字运算的电子机器。现代的电子计算器能进行数学运算的手持电子机器,拥有集成电路芯片,但结构比...在Android系统上制作计算器,这个小程序的步骤是怎样的呢

           计算器对于我们来说并不陌生,它是现代人发明的可以进行数字运算的电子机器。现代的电子计算器能进行数学运算的手持电子机器,拥有集成电路芯片,但结构比电脑简单得多,可以说是第一代的电子计算机(电脑),且功能也较弱,但较为方便与廉价,可广泛运用于商业交易中,但现在广泛被使用的计算器应该在手机应用上,几乎每台手机都有这个小程序,而使用起来也很方便。在Android系统上制作计算器,这个小程序的步骤是怎样的呢,本文就是写关于android小程序计算器的制作。

     学习android小程序计算器的制作_android_小程序_安卓小程序_课课家

     以前用Python、js写的计算器都是弱智型的,主要是练怎么做简单的UI,这次Android的计算器看到了不同的实现逻辑,虽然不是很难,但是以我的智商貌似真的想不到。

      一、布局就先不说了,我现在也没全弄懂,都是用手拖上去的,定义了16个按钮,主要说一下计算器的实现逻辑,首先建一个Item类,有value和type两个属性,value是double型,用来存数字,type是Int型,用来代替符号(加减乘除),构造方法可以定义这两个属性。

      二、建一个Types类用来存运算符号对应的数字,别引入sql里面那个Types,不然会报错:

      三、在mainactivity中构造一个Items的队列,就用三个元素,第一个存数字和结果,第二个存符号,第三个存数字:

      、定义一个checkAndCompute()方法,每次用户按下按钮的时候都会执行,当检查到队列items中元素数大于等于三时,进行算数操作:

      、在onclick()方法中绑定事件,清零就是把textview清零,把items队列清零,加减乘除运算符先向items队列中添加textview中的数字,之后检查是否需要计算,再向items队列中添加运算符,如果是等号的话,先获取数字,检查计算后直接输出items中第一个元素的value。

         五个步骤简单地制作完成了手机计算器小程序,其实使用可视化制作会比较简单,但是可视化有局限性,本文就用代码简单制作,有兴趣的同学也可以跟着我们的代码操作起来。

    展开全文
  • 项目描述利用android sdk结合sqllite制作的简单小程序,可以实现对数据的存储与查询,以及打印输入的数据。运行环境jdk9++API 27: Android 8.1 (Oreo)+android studio+SQLite+grade4.10.1项目技术(必填)sqllite + ...
  • 图形用户界面 (安卓图形用户界面) 吉特 还未公布 最低 JDK = 1.7 如何构建(未完成) 将系统环境“AGUI_HOME”设置为 agui sdk 文件夹
  • BeatYourBucketAndroid 为 beatyourbucket 网站制作 Android 应用程序
  • Android应用程序 该存储库包含一些简单的android应用。 所有的应用程序都是使用Android Studio制作的。
  • Android程序安装包APK的制作

    万次阅读 2011-11-11 13:53:55
    完成Android项目后,需要将程序打包成APK文件(Android Package),其后缀名为".apk"。打包的APK文件可以在Android模拟器或者Android手机上安装运行。 Android系统要求具有开发者签名的私人密钥的应用程序才可以被...
  • 作者:Sam (甄峰) sam_... 最近临时需要写一个Android 下播放视频的程序,在制作过程中,遇到一些知识点,存储如下: 1. 如何全屏显示View: 方法1: 使用代码修改: 在onCreate中添加以下红色代码: s
  • Android制作的自己的应用程序 AnagraMaker:这是一个应用程序,它通过给定一些通过参数传递的字母来搜索所有可能的组合,并比较它们在西班牙语词典中是否存在,如果存在,则返回包含所有单词以及访问RAE的可能性...
  • DoITMakeApplication :mobile_phone:制作一个Android应用程序项目 成员
  • 新闻检查 制作了新闻应用程序并由社区进行事实检查的android应用程序
  • 简单计算器 为 Android 制作的简单计算器应用程序
  • 完成Android项目后,需要将程序打包成APK文件(Android Package),其后缀名为".apk"。打包的APK文件可以在Android模拟器或者Android手机上安装运行。 Android系统要求具有开发者签名的私人密钥的应用程序才可以被...
  • 由Mindera制造的Android应用程序的utils库。 建立并发布! 说“ AAA”: 代码覆盖率: 继续计数! 为什么要使用它? 无需复制粘贴相同的utils程序包到每个新项目(也没有传播改进),只需使用此lib即可帮助您! 这...
  • Android-App-Dev-Practice:基本的应用程序开发实践练习,以准备实际的应用程序制作以及有关应用程序开发的更多知识
  • Android 屏幕保护程序制作及源码

    万次阅读 热门讨论 2011-01-21 18:04:00
    Android 屏蔽返回键 锁屏 屏保 屏蔽home键 屏蔽挂机键
  • FireWork 制作android 应用程序 icon

    千次阅读 2013-04-29 23:06:12
    FireWork 制作android 应用程序 icon 有时候自己写的一个android小应用,想给其添加自己喜爱的icon,探索了一下,使用fireword来制作: 效果图如下: 制作流程如下: 1、打开fireword,点击新建,新建一个...
  • 列表器 一个用于制作列表的Android应用程序
  • 主要介绍了Android基于AccessibilityService制作的钉钉自动签到程序代码,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,604
精华内容 20,241
关键字:

安卓程序制作