<p>you are doing all wrong from starting, do not use WalletAppKit use simple Wallet class, its offline wallet not Online, WalletAppKit needs internet to sync with the blockchain</p>

<pre><code>public void wallet()
{
    wallet = new Wallet(params);
    try
    {
        if(isDirCreated())
        {
            System.out.print("New Wallet");
            wallet.saveToFile(walletPath);
            System.out.println(wallet.currentReceiveAddress());
        }
        else
        {
            System.out.println("Load Wallet");
            // do something here
        }
    }
    catch (IOException e)
    {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
</code></pre>

CC BY-SA 4.0
2018-05-23T20:26:42.690Z
2018-05-23T20:26:42.690Z
Zombie
<p>I am new to bitcoins, I want to create an offline wallet on Android, to scan transaction QR code from online Desktop wallet, Sign that transaction with private key on my offline wallet.</p>

<p>1 Creating offline wallet.
2.Signing transaction offline with private key.</p>

<p>I want to sign transaction and generate QR code from that sign transaction.But after signing i get a sha256 in this form "MEQCIGBVDN/PkbESZdWkG6/KzrDRAEpDXVdsjKMzErBfFIWYAiA8JJOv97Dlp8Acg/L8JHI3RzoW                                                                       eYNxPW1Lx4wQaORNNQ==", so what will i do with this. So please help and review my code. Is my signing process ok or if not please comeup with some code.Thanks</p>

<p>So for i did the following.</p>

<p>// For creating wallet</p>

<p>private void InitilizeWallet() </p>

<p>throws IOException {</p>

<pre><code>    BriefLogFormatter.init();

    params = TestNet3Params.get();

    filePrefix = "forwarding-service-testnet";

    walletAppKit = new WalletAppKit(params, getCacheDir(), filePrefix) {
        @Override
        protected void onSetupCompleted() {

           if (wallet().getKeyChainGroupSize() &lt; 1)
                wallet().importKey(new ECKey());

            deterministicKey = wallet().getWatchingKey().dropPrivateBytes();
            deterministicKey = HDKeyDerivation.createMasterPubKeyFromBytes(deterministicKey.getPubKey(), deterministicKey.getChainCode());
            xPublicKey = deterministicKey.serializePubB58(params);    privateKey=wallet().getKeyByPath(DeterministicKeyChain.ACCOUNT_ZERO_PATH).getPrivateKeyAsWiF(params);
            Log.e("key", xPublicKey.toString());
            Log.e("privatekey", privateKey.toString());

        }
    };


    if (params == RegTestParams.get()) {
        // Regression test mode is designed for testing and development only, so there's no public network for it.
        // If you pick this mode, you're expected to be running a local "bitcoind -regtest" instance.
        walletAppKit.connectToLocalHost();
    }
    // Download the block chain and wait until it's done.


    walletAppKit.startAsync();
    walletAppKit.awaitRunning();

}
</code></pre>

<p>And for signing transaction i do the following.</p>

<p>public void Createtransictionhash(String recipientAddress, String amount) {</p>

<pre><code>    try {

          // i am getting address and coins from QR code

        SendRequest request = SendRequest.to(Address.fromBase58(params, 
        recipientAddress), Coin.parseCoin(amount));
            Signingtrasaction(MainActivity.privateKey,request.tx.getHashAsString());

        Log.e("txhash", request.tx.getHashAsString());

    } catch (Exception e) {
        Log.e("msgError", e.getMessage().toString());
        Toast.makeText(getApplicationContext(), " Version code of address did not match", Toast.LENGTH_SHORT).show();

    }
}

public void Signingtrasaction(String wif, String msg) {
    try {


        // message (hash) to be signed with private key
        //String msg = "15953935a135031bfec37d36a9d662aea43e1deb0ea463d6932ac6e537cb3e81";
        //my hash = 09b14f746bd0a93b71907ba0070a103adbee7b1a260e053a21aa0b660ad8de57
        // an example of WiF for private key (taken from 'Mastering Bitcoin')
       // wif ="KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ";

        // creating a key object from WiF
        DumpedPrivateKey dpk = DumpedPrivateKey.fromBase58(params, wif);
        ECKey key = dpk.getKey();

        // checking our key object
       // NetworkParameters main = MainNetParams.get();
        String check = key.getPrivateKeyAsWiF(params);
        System.out.println(wif.equals(check));  // true
        Log.e("wif check", String.valueOf(wif.equals(check)));
        // creating Sha object from string
        Sha256Hash hash = Sha256Hash.wrap(msg);

        // creating signature
        ECKey.ECDSASignature sig = key.sign(hash);

        // encoding
        byte[] res = sig.encodeToDER();

        // converting to hex
        //String hex = DatatypeConverter.printHexBinary(res);
        // String hex = new String(res);
        String hex = android.util.Base64.encodeToString(res, 16);

        Log.e("sigendTransiction", hex.toString());

        Log.e("decrypttx",""+ Hex.decode(sig.encodeToDER()));

    } catch (Exception e) {   //signingkey = ecdsa.from_string(privateKey.decode('hex'), curve=ecdsa.SECP256k1)
        Log.e("signing exception", e.getMessage().toString());
    }
}
</code></pre>

<bitcoinj><java><android>
How to create an offline wallet on Android only to sign transaction
Nain Kazi
# How to create an offline wallet on Android only to sign transaction

(Asked by: username_0 on 2018-01-12)

I am new to bitcoins, I want to create an offline wallet on Android, to scan transaction QR code from online Desktop wallet, Sign that transaction with private key on my offline wallet.
1 Creating offline wallet.
2.Signing transaction offline with private key.
I want to sign transaction and generate QR code from that sign transaction.But after signing i get a sha256 in this form "MEQCIGBVDN/PkbESZdWkG6/KzrDRAEpDXVdsjKMzErBfFIWYAiA8JJOv97Dlp8Acg/L8JHI3RzoW                                                                       eYNxPW1Lx4wQaORNNQ==", so what will i do with this. So please help and review my code. Is my signing process ok or if not please comeup with some code.Thanks
So for i did the following.
// For creating wallet
private void InitilizeWallet() 
throws IOException {
    BriefLogFormatter.init();

    params = TestNet3Params.get();

    filePrefix = "forwarding-service-testnet";

    walletAppKit = new WalletAppKit(params, getCacheDir(), filePrefix) {
        @Override
        protected void onSetupCompleted() {

           if (wallet().getKeyChainGroupSize() < 1)
                wallet().importKey(new ECKey());

            deterministicKey = wallet().getWatchingKey().dropPrivateBytes();
            deterministicKey = HDKeyDerivation.createMasterPubKeyFromBytes(deterministicKey.getPubKey(), deterministicKey.getChainCode());
            xPublicKey = deterministicKey.serializePubB58(params);    privateKey=wallet().getKeyByPath(DeterministicKeyChain.ACCOUNT_ZERO_PATH).getPrivateKeyAsWiF(params);
            Log.e("key", xPublicKey.toString());
            Log.e("privatekey", privateKey.toString());

        }
    };


    if (params == RegTestParams.get()) {
        // Regression test mode is designed for testing and development only, so there's no public network for it.
        // If you pick this mode, you're expected to be running a local "bitcoind -regtest" instance.
        walletAppKit.connectToLocalHost();
    }
    // Download the block chain and wait until it's done.


    walletAppKit.startAsync();
    walletAppKit.awaitRunning();

}

And for signing transaction i do the following.
public void Createtransictionhash(String recipientAddress, String amount) {
    try {

          // i am getting address and coins from QR code

        SendRequest request = SendRequest.to(Address.fromBase58(params, 
        recipientAddress), Coin.parseCoin(amount));
            Signingtrasaction(MainActivity.privateKey,request.tx.getHashAsString());

        Log.e("txhash", request.tx.getHashAsString());

    } catch (Exception e) {
        Log.e("msgError", e.getMessage().toString());
        Toast.makeText(getApplicationContext(), " Version code of address did not match", Toast.LENGTH_SHORT).show();

    }
}

public void Signingtrasaction(String wif, String msg) {
    try {


        // message (hash) to be signed with private key
        //String msg = "15953935a135031bfec37d36a9d662aea43e1deb0ea463d6932ac6e537cb3e81";
        //my hash = 09b14f746bd0a93b71907ba0070a103adbee7b1a260e053a21aa0b660ad8de57
        // an example of WiF for private key (taken from 'Mastering Bitcoin')
       // wif ="KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ";

        // creating a key object from WiF
        DumpedPrivateKey dpk = DumpedPrivateKey.fromBase58(params, wif);
        ECKey key = dpk.getKey();

        // checking our key object
       // NetworkParameters main = MainNetParams.get();
        String check = key.getPrivateKeyAsWiF(params);
        System.out.println(wif.equals(check));  // true
        Log.e("wif check", String.valueOf(wif.equals(check)));
        // creating Sha object from string
        Sha256Hash hash = Sha256Hash.wrap(msg);

        // creating signature
        ECKey.ECDSASignature sig = key.sign(hash);

        // encoding
        byte[] res = sig.encodeToDER();

        // converting to hex
        //String hex = DatatypeConverter.printHexBinary(res);
        // String hex = new String(res);
        String hex = android.util.Base64.encodeToString(res, 16);

        Log.e("sigendTransiction", hex.toString());

        Log.e("decrypttx",""+ Hex.decode(sig.encodeToDER()));

    } catch (Exception e) {   //signingkey = ecdsa.from_string(privateKey.decode('hex'), curve=ecdsa.SECP256k1)
        Log.e("signing exception", e.getMessage().toString());
    }
}

**Tags:** bitcoinj, java, android


---

## 1 answers

### Answer by username_1 on 2018-05-23. Score: 1 | Accepted answer

you are doing all wrong from starting, do not use WalletAppKit use simple Wallet class, its offline wallet not Online, WalletAppKit needs internet to sync with the blockchain
public void wallet()
{
    wallet = new Wallet(params);
    try
    {
        if(isDirCreated())
        {
            System.out.print("New Wallet");
            wallet.saveToFile(walletPath);
            System.out.println(wallet.currentReceiveAddress());
        }
        else
        {
            System.out.println("Load Wallet");
            // do something here
        }
    }
    catch (IOException e)
    {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}


---

