应用内结算:库存不正确;让用户再次购买

2024-07-04

编辑*** 仍在寻找我原来问题的答案。为什么 Android 不会看到该商品之前已购买过,而是让用户再次付款?设置 SharedPreferences 是一个不错的主意,但是如果用户卸载了怎么办?他们将不得不再次购买。我不希望用户这样。谢谢。

我试图弄清楚为什么该应用程序无法正确清点,我从 TrivialDrive 获取了它并尝试将其变成我自己的。我相信我删除了所有消耗,并且我只有一件物品要购买;高级升级。该产品只能购买一次,切勿收取两次费用。当我在平板电脑上编译并运行该应用程序时,我通过了购买流程,一切似乎都很顺利,直到我使用任务管理器关闭该应用程序并重新打开它。一旦重新打开,它会要求再次购买溢价,而不是通过它并执行溢价功能。

这是代码:

public class myClass extends SherlockActivity {

private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;

private CharSequence mDrawerTitle;
private CharSequence mTitle;
private String[] mPlanetTitles;

public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
ProgressBar pd = null;
private ProgressDialog mProgressDialog;

Spinner spLoadFrom;
WebView wv;
private LinearLayout container;
private Button nextButton, closeButton;
private EditText findBox;

private static final String TAG = "Web";
IabHelper mHelper;

static boolean mIsPremium = false;
boolean mIsUserPremium = false;
boolean searchAllowed = false;

static final String PREM_SKU = "prem";

private ArrayAdapter<CharSequence> spinnerArrayAdapter;

String name_free[] = { };

String displayName_free[] = {  };

String name_premium[] = { };
String displayName_premium[] = {};


/** Called when the activity is first created. */
@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mylayout);

    mTitle = mDrawerTitle = getTitle();

    mPlanetTitles = getResources().getStringArray(
            R.array.fMenu);

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.left_drawer);

    // set a custom shadow that overlays the main content when the drawer
    // opens
    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
            GravityCompat.START);
    // set up the drawer's list view with items and click listener
    mDrawerList.setAdapter(new ArrayAdapter<String>(this,
            R.layout.drawer_list_item, mPlanetTitles));
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

    // enable ActionBar app icon to behave as action to toggle nav drawer
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);

    // ActionBarDrawerToggle ties together the the proper interactions
    // between the sliding drawer and the action bar app icon
    mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
    mDrawerLayout, /* DrawerLayout object */
    R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
    R.string.drawer_open, /* "open drawer" description for accessibility */
    R.string.drawer_close /* "close drawer" description for accessibility */
    ) {
        public void onDrawerClosed(View view) {
            getSupportActionBar().setTitle(mTitle);
            supportInvalidateOptionsMenu(); // creates call to
                                            // onPrepareOptionsMenu()
        }

        public void onDrawerOpened(View drawerView) {
            getSupportActionBar().setTitle(mDrawerTitle);
            supportInvalidateOptionsMenu(); // creates call to
                                            // onPrepareOptionsMenu()
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);

    if (savedInstanceState == null) {
        selectItem(0);
    }

    mProgressDialog = new ProgressDialog(this);
    mProgressDialog.setIndeterminate(false);
    mProgressDialog.setMax(100);
    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

    wv = (WebView) findViewById(R.id.webview);
    pd = (ProgressBar) findViewById(R.id.pBar);

    spLoadFrom = (Spinner) findViewById(R.id.Spinner02);

    if (mIsPremium == true) {
        spinnerArrayAdapter = new ArrayAdapter<CharSequence>(this,
                android.R.layout.simple_spinner_item, displayName_premium);
    } else {
        spinnerArrayAdapter = new ArrayAdapter<CharSequence>(this,
                android.R.layout.simple_spinner_item, displayName_free);
    }

    spinnerArrayAdapter
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spLoadFrom.setAdapter(spinnerArrayAdapter);
    SpinnerListener spListener = new SpinnerListener();
    spLoadFrom.setOnItemSelectedListener(spListener);

    String base64EncodedPublicKey = "hidden";
    mHelper = new IabHelper(this, base64EncodedPublicKey);

    Log.d(TAG, "Starting setup.");
    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
        @Override
        public void onIabSetupFinished(IabResult result) {
            Log.d(TAG, "Setup finished.");

            if (!result.isSuccess()) {
                // Oh noes, there was a problem.
                complain("Problem setting up in-app billing: " + result);
                return;
            }

            // Hooray, IAB is fully set up. Now, let's get an inventory of
            // stuff we own.
            Log.d(TAG, "Setup successful. Querying inventory.");
            mHelper.queryInventoryAsync(mGotInventoryListener);
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.menu3, menu);
    return super.onCreateOptionsMenu(menu);
}

/* Called whenever we call invalidateOptionsMenu() */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    // If the nav drawer is open, hide action items related to the content
    // view
    boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(final MenuItem item) {
    if (mDrawerToggle.onOptionsItemSelected(getMenuItem(item))) {
        return true;
    }

    int itemId = item.getItemId();
    if (itemId == R.id.search) {
        if (searchAllowed == false) {

    } else if (itemId == R.id.contact) {
        emailme();
    } else if (itemId == R.id.rate) {
        Uri uri = Uri.parse("market://details?id=" + getPackageName());
        Intent myAppLinkToMarket = new Intent(Intent.ACTION_VIEW, uri);
        try {
            startActivity(myAppLinkToMarket);
        } catch (ActivityNotFoundException e) {
            Toast.makeText(this, "Unable to find Play Market",
                    Toast.LENGTH_SHORT).show();
        }
    }
    return super.onOptionsItemSelected(item);

}

public void buyPrem() {
    Log.d(TAG,
            "Upgrade button clicked; launching purchase flow for upgrade.");
    /*
     * TODO: for security, generate your payload here for verification. See
     * the comments on verifyDeveloperPayload() for more info. Since this is
     * a SAMPLE, we just use an empty string, but on a production app you
     * should carefully generate this.
     */
    String payload = "";

    mHelper.launchPurchaseFlow(this, PREM_SKU, 10001,
            mPurchaseFinishedListener, payload);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + ","
            + data);

    // Pass on the activity result to the helper for handling
    if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
        // not handled, so handle it ourselves (here's where you'd
        // perform any handling of activity results not related to in-app
        // billing...
        super.onActivityResult(requestCode, resultCode, data);
    } else {
        Log.d(TAG, "onActivityResult handled by IABUtil.");
    }
}

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
    @Override
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
        Log.d(TAG, "Purchase finished: " + result + ", purchase: "
                + purchase);
        if (result.isFailure()) {
            complain("Error purchasing: " + result);
            // Handle error
            return;

        }
        if (!verifyDeveloperPayload(purchase)) {
            complain("Error purchasing. Authenticity verification failed.");
            return;

        }
        Log.d(TAG, "Purchase successful.");

        if (purchase.getSku().equals(PREM_SKU)) {
            // bought the premium upgrade!
            Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
            alert("Thank you for upgrading to premium!");
            mIsPremium = true;
            mIsUserPremium = true;
            searchAllowed = true;
        }

    }
};

IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    @Override
    public void onQueryInventoryFinished(IabResult result,
            Inventory inventory) {
        Log.d(TAG, "Query inventory finished.");
        if (result.isFailure()) {
            complain("Failed to query inventory: " + result);
            return;
        }

        /*if (inventory.hasPurchase(PREM_SKU)) {

            mHelper.consumeAsync(inventory.getPurchase(PREM_SKU), null);
        }*/

        Log.d(TAG, "Query inventory was successful.");

        Purchase premiumPurchase = inventory.getPurchase(PREM_SKU);
        mIsPremium = (premiumPurchase != null && verifyDeveloperPayload(premiumPurchase));
        Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));
        if (mIsPremium) {
            searchAllowed = true;
            mIsUserPremium = true;
            Log.d(TAG, "Should be premium by now...");
        }

        Log.d(TAG, "Initial inventory query finished; enabling main UI.");
    }

};

boolean verifyDeveloperPayload(Purchase p) {
    String payload = p.getDeveloperPayload();

    /*
     * TODO: verify that the developer payload of the purchase is correct.
     * It will be the same one that you sent when initiating the purchase.
     * 
     * WARNING: Locally generating a random string when starting a purchase
     * and verifying it here might seem like a good approach, but this will
     * fail in the case where the user purchases an item on one device and
     * then uses your app on a different device, because on the other device
     * you will not have access to the random string you originally
     * generated.
     * 
     * So a good developer payload has these characteristics:
     * 
     * 1. If two different users purchase an item, the payload is different
     * between them, so that one user's purchase can't be replayed to
     * another user.
     * 
     * 2. The payload must be such that you can verify it even when the app
     * wasn't the one who initiated the purchase flow (so that items
     * purchased by the user on one device work on other devices owned by
     * the user).
     * 
     * Using your own server to store and verify developer payloads across
     * app installations is recommended.
     */

    return true;
}

/*public void consumeItem() {
    mHelper.queryInventoryAsync(mReceivedInventoryListener);

}*/

IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    @Override
    public void onQueryInventoryFinished(IabResult result,
            Inventory inventory) {

        if (result.isFailure()) {
            // Handle failure
        } else {
            searchAllowed = false;
            //mHelper.consumeAsync(inventory.getPurchase(PREM_SKU),
            //      mConsumeFinishedListener);
        }
    }
};

IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
    @Override
    public void onConsumeFinished(Purchase purchase, IabResult result) {

        if (result.isSuccess()) {

        } else {
            // handle error
        }
    }
};

@Override
public void onDestroy() {
    super.onDestroy();
    if (mHelper != null)
        mHelper.dispose();
    mHelper = null;
}

void complain(String message) {
    Log.e(TAG, "**** TrivialDrive Error: " + message);
    alert("Error: " + message);
}

void alert(String message) {
    AlertDialog.Builder bld = new AlertDialog.Builder(this);
    bld.setMessage(message);
    bld.setNeutralButton("OK", null);
    Log.d(TAG, "Showing alert dialog: " + message);
    bld.create().show();
}

private android.view.MenuItem getMenuItem(final MenuItem item) {
    return new android.view.MenuItem() {
        @Override
        public int getItemId() {
            return item.getItemId();
        }

        public boolean isEnabled() {
            return true;
        }

        @Override
        public boolean collapseActionView() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean expandActionView() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public ActionProvider getActionProvider() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public View getActionView() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public char getAlphabeticShortcut() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public int getGroupId() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public Drawable getIcon() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public Intent getIntent() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public ContextMenuInfo getMenuInfo() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public char getNumericShortcut() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public int getOrder() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public SubMenu getSubMenu() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public CharSequence getTitle() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public CharSequence getTitleCondensed() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public boolean hasSubMenu() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean isActionViewExpanded() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean isCheckable() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean isChecked() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean isVisible() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public android.view.MenuItem setActionProvider(
                ActionProvider actionProvider) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setActionView(View view) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setActionView(int resId) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setAlphabeticShortcut(char alphaChar) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setCheckable(boolean checkable) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setChecked(boolean checked) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setEnabled(boolean enabled) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setIcon(Drawable icon) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setIcon(int iconRes) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setIntent(Intent intent) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setNumericShortcut(char numericChar) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setOnActionExpandListener(
                OnActionExpandListener listener) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setOnMenuItemClickListener(
                OnMenuItemClickListener menuItemClickListener) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setShortcut(char numericChar,
                char alphaChar) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public void setShowAsAction(int actionEnum) {
            // TODO Auto-generated method stub

        }

        @Override
        public android.view.MenuItem setShowAsActionFlags(int actionEnum) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setTitle(CharSequence title) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setTitle(int title) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setTitleCondensed(CharSequence title) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public android.view.MenuItem setVisible(boolean visible) {
            // TODO Auto-generated method stub
            return null;
        }
    };
}

private class DrawerItemClickListener implements
        ListView.OnItemClickListener {

    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {

        switch (position) {
        case 0:
            mDrawerLayout.closeDrawer(mDrawerList);
            break;
        case 1:
            Intent c1 = new Intent(getBaseContext(), 1.class);
            startActivity(c1);
            break;
        case 2:
            Intent c2 = new Intent(getBaseContext(), 5.class);
            startActivity(c2);
            break;
        case 3:
            Intent c3 = new Intent(getBaseContext(), 3.class);
            startActivity(c3);
            break;
        case 4:
            Intent c4 = new Intent(getBaseContext(), 4.class);
            startActivity(c4);
            break;
        default:
        }
    }
}

public void selectItem(int position) {
    switch (position) {
    case 0:
        break;
    case 1:
        setContentView(R.layout.1);
        break;
    case 2:
        setContentView(R.layout.2);
        break;
    case 3:
        setContentView(R.layout.3);
        break;
    case 4:
        setContentView(R.layout.4);
        break;
    default:
    }
}

@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    getSupportActionBar().setTitle(mTitle);
}

/**
 * When using the ActionBarDrawerToggle, you must call it during
 * onPostCreate() and onConfigurationChanged()...
 */

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // Pass any configuration change to the drawer toggls
    mDrawerToggle.onConfigurationChanged(newConfig);
}

}

通过关闭应用程序,您将删除所有变量,包括 mIsPremium。

因此,您需要将 mIsPremium 的值保存在某处,并在再次打开应用程序时加载它。

我建议你使用共享首选项 https://developer.android.com/reference/android/content/SharedPreferences.html为了这个任务。

这就是你可以这样做的方法:

In the IabHelper.OnIabPurchaseFinishedListener您需要保存您的偏好:

if (purchase.getSku().equals(PREM_SKU)) {
        // bought the premium upgrade!
        Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
        alert("Thank you for upgrading to premium!");
        mIsPremium = true;
        mIsUserPremium = true;
        searchAllowed = true;
        SharedPreferences prefs = this.getBaseContext().getSharedPreferences(
                "com.example.yourapp", 0);
        prefs.edit().putBoolean("premium", true).apply;
}

在用户成功购买高级版后,您可以在此处将高级版状态“true”保存到共享首选项“高级版”。

In the onCreate()您需要加载首选项的方法:

SharedPreferences prefs = this.getBaseContext().getSharedPreferences(
        "com.example.yourapp", 0);
mIsPremium = prefs.getBoolean("premium", false);

在这里您加载首选项“premium”,如果此首选项尚不存在,则将采用“false”作为默认值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

应用内结算:库存不正确;让用户再次购买 的相关文章

  • SurfaceView 将视频播放为拉伸视图

    我正在使用 mediaplayer xml 来播放视频文件
  • 如何在android中实现按钮的非矩形形状

    hi i have to realize this layout it has this layout 我可以尝试使用图标作为图像按钮 但按钮的活动状态有点像这个 我应该如何进行 你应该使用selector如下 准备2张按钮状态图片 放入r
  • Firebase 数据库崩溃 SQLiteDatabaseLockedException

    我在少数设备上遇到此崩溃 但仅限于 Android 4 我使用的是 Firebase Android SDK 10 2 1 11 0 2 推迟更新到最新版本 因为它也会强制更新 Google Play 服务 并且许多用户继续保留旧的 GPS
  • 将按钮与 ScrollView 中的底部对齐

    我正在尝试将按钮与 ScrollView 底部对齐并使 ScrollView 填充页面 第一张截图是它的样子 第二张截图是我想要的 在屏幕截图中 未使用 ScrollView 因为没有足够的项目 但 ScrollView 内的项目数量不固定
  • WorkManager 的 doWork() 为 OneTimeWorkRequest 多次调用

    我才刚刚开始探索WorkManager在我的应用程序中 我的应用程序大部分都是离线的 因此所有数据都使用 room db 存储在本地 一旦设备连接到网络 我想将本地数据同步到服务器 然后获取最新数据并再次同步本地数据库 这是我的doWork
  • 如何知道活动何时安排?

    我有一个地图视图 我想在其上放置一些标记 当我开始活动时 我将从网络服务中检索这些数据 因此我需要知道当前视口的最小和最大纬度 经度对 我正在打电话 mMapView getWidth mMapView getHeight 但当活动开始时它
  • Firebase 持久性如何存储我的 Android 应用的本地数据

    我正在制作一个类似于 WhatsApp 的 Android 应用程序 在该应用程序中 用户可以发送文本和图像 为了保存消息以便可以离线查看 我使用了 FirebaseDatabase getInstance setPersistenceEn
  • Android应用程序启动图标大小[重复]

    这个问题在这里已经有答案了 遵循 Google 的指南 我已将 48x48 和 72x72 启动器图标添加到我的 mdpi 和 hdpi 屏幕项目中 但在某些情况下 图标的大小会被调整 例如 在我的 Acer Iconia A200 平板电
  • 禁用 ListView 上的波纹

    在 Android 5 0 中 我的 ListView 在单击列表项时会产生连锁反应 有没有办法禁用这个效果 查看文档 我没有看到任何方法 https developer android com reference android widg
  • 如何确定Android设备的安全补丁级别?

    如何使用 API 或其他机制确定 Android 设备的安全补丁级别 我正在寻找相同的安全补丁信息 可以通过单击手动找到Settings gt About设备上的菜单 例如 谷歌每月都会发布安全补丁2016 12 01 https sour
  • 如何使用 Android Volley 显示/请求 JSON 对象?

    我在 Android Studio 中遇到如何请求 JSON 对象的问题 我的 Logcat 只能打印 String onResponse 而不能打印 JSONObject 值 我在 AccessActivity java 内的 try 行
  • 应用内结算:库存不正确;让用户再次购买

    编辑 仍在寻找我原来问题的答案 为什么 Android 不会看到该商品之前已购买过 而是让用户再次付款 设置 SharedPreferences 是一个不错的主意 但是如果用户卸载了怎么办 他们将不得不再次购买 我不希望用户这样 谢谢 我试
  • 为什么我无法将文件上传到 Firebase Storage

    我正在尝试将 jpg 文件上传到 Firebase 存储 这是我的问题 fun sharePost view View val uuid UUID randomUUID val uniqueImgName uuid jpg val imgR
  • getAllNetworkInfo() 在 M 中已弃用,但其替代品具有不同的行为

    ConnectivityManager 的 getAllNetworkInfo 在 API 23 上已弃用 其注释表示使用 getAllNetworks 代替 然而我发现这些没有相同的行为 例如 如果手机有可用的活动蜂窝网络 但 wifi
  • Eclipse 创建 Java 虚拟机失败

    我正在使用 eclipse 开发 android 应用程序 它总是进展顺利 但今天它出现了问题 当我尝试打开 Eclipse 时 它 向我显示此消息 Failed to create the java virtual machine Err
  • SQlite - Android - 外键语法

    我一直在尝试让外键在我的 Android SQLite 数据库中工作 我尝试过以下语法 但它给了我强制关闭 private static final String TASK TABLE CREATE create table TASK TA
  • 读取 NFC 标签时出现奇怪的字符

    我正在尝试使用 Android 读取 NFC 标签 我是一名养蜂人 这是为了在我接近蜂巢时识别它们 我已经在这里搜索过 但阅读标签时仍然遇到问题 我想阅读文本 但是当它阅读时 在所需文本之前有一个类似正方形的字符和显示为 十 的字符 这是我
  • React-native 应用程序在真实的 Android 设备上崩溃

    我正在使用react native 目前开始使用redux并创建了一个应用程序 但是当我在模拟器上运行该应用程序时 它工作正常 然后我通过 USB 将我的手机与 android 6 连接 它也可以工作 但在 Android 8 的其他设备中
  • Android 嵌套片段问题“java.lang.IllegalStateException:活动已被销毁”

    您可能知道 Android 支持嵌套片段 也是通过 API 级别 17 的支持库实现的 所以基本上我正在尝试将嵌套片段添加到 ViewPager 的片段之一中 并熟悉这一新的好功能 在第一次应用程序启动时 一切都按预期工作 即我可以添加子片
  • 创建自定义 Google Now 卡片

    Google 为 Google Now 提供了各种 卡片 http www google com landing now http www google com landing now 可以创建自己的卡片吗 该系统看起来非常模块化 但我还没

随机推荐

  • 在 Java 中将 HTML 转换为纯文本

    我需要将 HTML 转换为纯文本 我对格式的唯一要求是在纯文本中保留新行 新行不仅应在以下情况下显示 br 但其他标签 例如 tr tr 也通向一条新线 用于测试的示例 HTML 页面是 http www article kth se li
  • TURN 服务器缺少中继候选者

    刚刚安装了 coturn 服务器 https github com coturn rfc5766 turn server https github com coturn rfc5766 turn server 看起来我只得到了 STUN 候
  • fgetpos/fsetpos 和 ftell/fseek 之间有什么区别

    使用函数有什么区别fgetpos and fsetpos 并使用函数ftell and fseek 获取和设置文件中的位置 什么是fgetpos and fsetpos 有什么好处 为什么要使用它们而不是ftell and fseek 以上
  • 模糊不同值

    我有一个房地产列表数据库 需要返回社区列表 现在我正在使用 mysql DISTINCT 它返回所有不同的值 我的问题是有很多社区具有相似的名称 例如 Park View Sub 1 Park View Park View Sub 2 Pa
  • Chrome 控制台有没有办法在控制台输出中搜索字符串,即使是折叠的字符串?

    我不想只过滤控制台输出 而是还要在其中搜索字符串 显示或折叠 是否可以 CTRL F 无法在折叠的输出中搜索 例如 如果输出是Array 3 它显示为一棵倒塌的树 即使您单击展开以显示有关阵列的详细信息 您也无法在其中进行搜索 The Fi
  • 模板元编程 - 使用 Enum Hack 和 Static Const 之间的区别

    我想知道在使用模板元编程技术时使用 static const 和 enum hack 之间有什么区别 EX 斐波那契通过 TMP template lt int n gt struct TMPFib static const int val
  • Capybara Poltergeist/PhantomJS 测试 - 禁用页面上的 javascript

    我的项目中有一个是 javascript 密集型的 所以我有一个
  • 在 C# 中访问交换电子邮件

    你知道有没有办法吗 我用过这个图书馆 http www codeproject com KB IP NetPopMimeClient aspx 20访问 pop3 服务器 但它不能与 Exchange 服务器一起使用 您是否知道任何其他库或
  • 从Python运行Scrapy

    我正在尝试从 Python 运行 Scrapy 我正在查看这段代码 source http doc scrapy org en 0 16 topics practices html from twisted internet import
  • 当前图像居中的 flexslider

    我正在尝试构建一个 Flexslider 轮播 它有多个图像 但当前图像居中 任一侧的下一个 上一个图像离开屏幕 就像这个网站http www ncad ie http www ncad ie 到目前为止 我已经用一张图片得到了它 http
  • 如何在 Swift 中观察多个节点中 Firebase 子值的变化?

    我的 Firebase 数据库中有一个 用户 节点 其中的每个用户都有一个 root 及其 uid 每个用户的属性之一是 坐标 我想观察所有用户的任何坐标的任何变化 我几乎需要这样的东西 usersDatabaseReference chi
  • iPad html5 视频没有控件?

    这让我苦恼了一整天 但我不知道如何让 html5 视频播放器在没有本机控件的情况下工作 我不想要任何控件 但如果我不包含它们 视频似乎不想播放 即使我在下面添加一些 javascript 试图强制它播放 它也适用于 iPhone 和多个浏览
  • ColorMatrix CSS 过滤器将黑白图像转换为双色调

    我需要创建一个自定义 CSS 过滤器 它将黑白图像转换为具有两种自定义颜色的双色图像 我想以这样的方式应用过滤器 不确定这种语法是否可行 也许需要单独传递 6 个参数 duotone webkit filter custom none ur
  • RecyclerView 仅显示 Firebase 中的一项

    我知道关于这个问题的疑问很少 但他们都没有解决我的问题 特别是我的代码是用 Kotlin 编写的 并且是新的Fragments 不要急于说我的问题是重复的 我的问题正是标题所说的 我的RecyclerView仅填充了来自的一项 子项 Fir
  • 新项目应该使用哪个 Android Camera API?

    我正在开发一个新的应用程序 我想一直支持果冻豆 冰淇淋三明治 我需要在我的应用程序中使用摄像机 只是拍摄一些 15 秒的镜头 无需处理 我是否必须编写两个相机活动 一个使用相机 api 另一个使用camera2 api 并以某种方式根据设备
  • WPF - 组合框 - 当用户在组合中输入文本时添加项目

    我有一个ComboBox与一个绑定ObservableCollection 当用户在其中输入文本时我该怎么办ComboBox 如果项目不在列表中 代码会自动将新项目添加到列表中
  • `pub get` 将 pubspec 依赖项下载到哪里?

    在 javascript 中 我们有 NPM 和node modules每个项目中的文件夹 我找不到 Dart Flutter 的类似概念 除了build我的应用程序中的文件夹 其中包含我的一些依赖项的文件夹pubspec yaml 但它没
  • 使用 javascript 分割图像

    如何使用 javascript 获取单个图像的一部分并将其存储在数组中 然后在 html5 画布上随机显示 您可以使用drawImage 方法的剪切参数并将剪切的图像绘制到动态创建的画布上 一个例子可以是 function getClipp
  • Angular2 2.4.3 和响应式网页设计:使用媒体查询似乎不起作用

    当将 Angular2 2 4 3 与 CSS3 媒体查询功能结合使用时 直接嵌入到 Angular2 组件中 参见下面的示例 or 使用 styles css 在 index html 中集中引用 这两种情况下的 html 组件都没有根据
  • 应用内结算:库存不正确;让用户再次购买

    编辑 仍在寻找我原来问题的答案 为什么 Android 不会看到该商品之前已购买过 而是让用户再次付款 设置 SharedPreferences 是一个不错的主意 但是如果用户卸载了怎么办 他们将不得不再次购买 我不希望用户这样 谢谢 我试