小编caw*_*caw的帖子

在Android中预先填充数据库的最快,最有效的方法

如果你想在Android中预先填充数据库(SQLite),这并不像人们想象的那么容易.

所以我发现这个教程也经常在Stack Overflow上引用.

但是我不喜欢这种预先填充数据库的方式,因为你从数据库处理程序中获取控件并自己创建文件.我宁愿不触摸文件系统,让数据库处理程序自己完成所有事情.

所以我认为可以做的就是像往常一样在数据库处理程序的onCreate()中创建数据库,然后从/ assets加载一个文件(.sql),其中包含要填充值的语句:

INSERT INTO testTable (name, pet) VALUES ('Mike', 'Tiger');
INSERT INTO testTable (name, pet) VALUES ('Tom', 'Cat');
...
Run Code Online (Sandbox Code Playgroud)

但是在处理程序的onCreate()中调用execSQL()并不能真正起作用.似乎/ assets文件的大小不得超过1MB,而execSQL()只执行第一个语句(Mike-Tiger).

你会做什么做预先填充数据库?

sql database sqlite android

13
推荐指数
1
解决办法
2万
查看次数

帐户验证:每人只能使用一个帐户

在我的社区中,每个用户应该只有一个帐户.

所以我需要一个解决方案来验证特定帐户是用户拥有的唯一帐户.目前,我使用电子邮件验证.但我真的不需要用户的电子邮件地址.我只是试图阻止每个人的多个帐户.

但是,这当然不起作用.无论如何,人们创建临时电子邮件地址或拥有多个地址.因此,他们使用不同的电子邮件地址注册,因此他们获得了多个帐户 - 这是不允许的.

所以我需要一个比(易于规避)电子邮件验证更好的解决方案.顺便说一下,我不想使用OpenID,Facebook Connect等.

要求:

  • 验证方法必须可供所有用户访问
  • 用户应该没有任何费用(至少1美元)
  • 验证必须安全(比电子邮件方法更安全)
  • 不应要求用户公开过多的私人信息
  • ...

你有好方法的想法吗?非常感谢你提前!

附加信息:

我的社区是一个浏览器游戏,即足球经理游戏.使多个帐户具有吸引力的是用户可以交易他们的玩家.因此,如果您有两个账户,您可以购买价格过高的弱势玩家,这是"真正的"买家无法支付的.因此,当"第二个帐户"变得贫穷时,您的"第一个帐户"会获得巨额资金.但你不必关心:只需创建另一个帐户,使第一个帐户更丰富.

verification account-management user-accounts

12
推荐指数
2
解决办法
3443
查看次数

Android中的加泰罗尼亚语和巴斯克语资源

如果要在Android中添加特定于语言环境的资源,则必须将该语言的小写ISO-3166-1代码添加到资源文件夹的名称中.到现在为止还挺好.

现在我想在我的应用程序中添加加泰罗尼亚语巴斯克语字符串.根据ISO列表,我将不得不添加values-cavalues-eu.但这会有效吗?

编辑:使用应用程序中的自定义语言选择器,即使语言不在设备的设置菜单中,也可以为语言提供支持.我已经在GitHub上创建了我用的库:https: //github.com/delight-im/Android-Languages

我不知道Android是否支持所有ISO代码,是否会显示这些"次要"语言.如果Android没有这些语言版本,那么该设备可能甚至不会将此语言识别为其默认语言环境,而只是es用于西班牙语.

有人可以帮忙吗?

android localization

12
推荐指数
1
解决办法
3755
查看次数

如何真正洗牌一副牌

当我需要在Java/Android中随机播放一副扑克牌时,我Collections.shuffle(List<?> list)当然会使用它.我一直这样做,结果似乎可以接受.但他们不是.

本文所述,有52个!52张牌扑克牌可能独一无二的洗牌.这相当于约2 ^ 226.

但是,Collections.shuffle(List<?> list)使用new Random()默认它采用了48位的种子,因此只能创建2 ^ 48独特的洗牌-这仅是3.49*10^(-52)所有可能的洗牌%的!

那么如何以正确的方式洗牌呢?

我已经开始使用了SecureRandom,但最后还够吗?

List<Card> cards = new ArrayList<Card>();
...
SecureRandom secureRandom;
try {
    secureRandom = SecureRandom.getInstance("SHA1PRNG");
}
catch (NoSuchAlgorithmException e) {
    secureRandom = new SecureRandom();
}
secureRandom.nextBytes(new byte[20]); // force SecureRandom to seed itself
Collections.shuffle(cards, secureRandom);
Run Code Online (Sandbox Code Playgroud)

java random android shuffle playing-cards

12
推荐指数
1
解决办法
3342
查看次数

在后台不会被杀死的长期服务活动

在Android上,我有一个Activity被叫FirstActivity,它启动一个Service名为MyService在后台做网络的东西.ActivityService相互所有的时间通过调用方法通信.

现在,当用户从导航FirstActivitySecondActivity,后台服务应该不会被杀死或重新创建的,但维持生命,并传递给SecondActivity现在将是一个与服务进行通信.

换句话说,Service只要两个Activitys中的一个正在运行,它就应该运行,并且当用户在两个Activitys 之间导航时它不应该停止.

其中一个Activity将永远在前台,在此期间,服务应该(最佳)永远不会被杀死.我认为这应该不是问题,因为这两个中Activity的一个总是活跃的,因此Android知道服务很重要而不是必须被杀死的东西.

(如果没有办法阻止Android不时地杀死和重新创建服务,我需要一种方法来优雅地恢复服务的完整状态.)

总而言之,它Service应该具有与两个Activity"组合" 相同的寿命.它应该从它们中的第一个开始,并且在它们都被破坏之前停止.

以下代码是否适用于该设置和目标?

public class MyService extends Service {

    public class LocalBinder extends Binder {
        public MyService getService() {
            return MyService.this;
        }
    }

    ...

}

public class FirstActivity extends Activity {

    private MyService mMyService;

    private ServiceConnection mMainServiceConnection = new …
Run Code Online (Sandbox Code Playgroud)

android android-service android-lifecycle android-service-binding

12
推荐指数
1
解决办法
689
查看次数

将Java/Android堆栈跟踪分组到唯一存储桶中

在Java或Android中记录未处理异常的堆栈跟踪时(例如通过ACRA),通常会将堆栈跟踪视为普通长字符串.

现在,所有提供崩溃报告和分析的服务(例如Google Play Developer Console,Crashlytics)都将这些堆栈跟踪分组到独特的存储桶中.这显然很有用 - 否则,您的列表中可能会有数万个崩溃报告,但其中只有十几个可能是唯一的.

例:

java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1027)
Caused by: java.lang.ArrayIndexOutOfBoundsException
at com.my.package.MyClass.i(SourceFile:1059)
...
Run Code Online (Sandbox Code Playgroud)

上面的堆栈跟踪可能出现在多个变体中,例如,AsyncTask由于不同的平台版本,平台类可能会出现不同的行号.

为每个崩溃报告获取唯一标识符的最佳技术是什么?

很清楚的是,对于您发布的每个新应用程序版本,崩溃报告应该分开处理,因为编译的源代码不同.在ACRA中,您可以考虑使用该字段APP_VERSION_CODE.

但除此之外,您如何识别具有独特原因的报告?通过获取第一行搜索第一次出现的自定义(非平台)类并查找文件和行号?

java android stack-trace acra

12
推荐指数
1
解决办法
739
查看次数

PHP:所有脚本中的ignore_user_abort(true)

我有一个在服务器端使用PHP的网站.

用户访问页面,PHP进行一些计算,将数据写入MySQL数据库等.

想象一下,用户访问PHP为用户创建帐户的页面.创建包括两部分:将注册数据插入"用户"表,并将此帐户的设置插入表"设置".这是两个必须一个接一个地执行的SQL查询.如果用户在第一次查询后退出页面,则"设置"中不会插入任何值.

我怎么能避免这个问题?我想只需使用ignore_user_abort(true),对吗?

那么在每个PHP脚本的顶部调用ignore_user_abort(true)是不是很有用?我不知道它应该导致问题的任何情况.

php user-interface abort

11
推荐指数
1
解决办法
6487
查看次数

为Android应用程序中的每个联系人获取生日

在我的Android应用程序中,我使用以下代码读出所有联系人:

ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if (cur.getCount() > 0) {
    while (cur.moveToNext()) {
        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
        String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        ContentResolver bd = getContentResolver();
        String where = Data.RAW_CONTACT_ID+" = "+id+" and "+Data.MIMETYPE+" = "+CommonDataKinds.Event.CONTENT_ITEM_TYPE;
        Cursor bdc = bd.query(ContactsContract.Data.CONTENT_URI, null, where, null, null);
        if (bdc.getCount() > 0) {
            while (bdc.moveToNext()) {
                String birthday = bdc.getString(0);
                Toast.makeText(getApplicationContext(), id+name+birthday, Toast.LENGTH_SHORT);
            }
        }
    }
}
cur.close();
Run Code Online (Sandbox Code Playgroud)

这就是我试图读出每个联系人的生日事件的方式.但显然它还没有奏效.那么如何才能正确读出联系人的出生日期?

java android contacts date-of-birth

11
推荐指数
1
解决办法
1万
查看次数

Facebook使用Android SDK 3.0登录导致ANR或根本不工作

为了在Android应用中将用户登录到Facebook,我正在尝试使用以下代码.用户登录后,应该获取他们所有朋友的位置.

不幸的是,此代码有时会导致ANR(如Google Play开发人员控制台中所报告的那样),有时它无法正常工作.如果我删除Facebook内的应用程序(撤销权限),则会在下次启动Android应用时再次显示权限对话框.但是,如果应用程序已具有权限,则会导致这些ANR或仅退出而不成功.

好像零件正在工作而零件错了,不是吗?以下代码是否是登录和获取数据的正确方法?

package com.my.application;

import java.util.Arrays;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.preference.PreferenceManager;
import com.facebook.*;
import com.facebook.Session.OpenRequest;
import com.facebook.Session.StatusCallback;

public class FBLocations extends Activity {

    private Session.StatusCallback fbStatusCallback = new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state, Exception exception) { // callback for session state changes
            if (state.isOpened()) {
                Request.executeGraphPathRequestAsync(session, "me/friends/?access_token="+session.getAccessToken()+"&fields=id,name,location&limit=500", new Request.Callback() {
                    @Override
                    public void onCompleted(Response response) {
                        if (response != null) {
                            // do …
Run Code Online (Sandbox Code Playgroud)

android facebook-android-sdk

10
推荐指数
1
解决办法
5368
查看次数

特定于密度的布局与Android中特定于大小的布局

很长一段时间,我一直在为4种不同的密度声明资源文件夹:

  • 绘制,LDPI
  • 绘制,MDPI
  • 绘制,华电国际
  • 绘制,xhdpi

在布局的XML中,我一直在使用固定宽度(虽然仍然是密度无关的),例如128dp那些图形.

然而,当越来越多的大屏幕手机,特别是平板电脑被引入时,这种方法不再适用.虽然您以这种方式提供与密度无关的资源,但在大屏幕上布局看起来不太好.

这就是为什么我认为我需要添加Dimension依赖于屏幕大小的资源,以便在XML布局中使用,例如:

  • 价值观w600dp
  • 价值观w720dp
  • 价值观w1024dp

但这是否意味着我应该放弃支持这4个密度容器?或者我需要提供16个资源文件夹,即每个密度和大小的组合一个?

关于这个主题,我在Android文档中找不到任何好的帮助.

android android-resources

10
推荐指数
1
解决办法
1849
查看次数