I am using Metamask for key storage in my dapp. My understanding is that the Metamask app injects a web3 object and handles all the signing functions where needed by itself. But Metamask currently provides support for chrome and firefox only (to my knowledge) and firefox plugin has some problems still (I get weird errors and plugin hangs up sometimes). I am not sure if there is android support either yet. So I want there to be alternative option to use either metamask or sign everything by asking user for key. I dont know how to the latter and if its possible to do both in same app.
If you follow the compatibility guidelines on developing for MetaMask, it's very likely that your dapp will also work correctly with MetaMask alternatives, such as Mist, Parity Browser, Toshi and SpaceSuit.
Asking users for a key is possible (EtherDelta give users this option, for example), but it's also a really bad habit to teach your users (EtherDelta got hacked a while back, and users who did this got their ether stolen).
An alternative is to make the interface to your smart contracts simple enough that calling the contracts directly (via something like MyEtherWallet, or Truffle console) is not too confusing.
Using metamask is just one way of doing it. You can also use MIST or any other wallet that supports web3. Though using metamask gets the job done quickly. If you can provide me some more detail of what exactly your app does then I can give you more specific solution.
This is what you need:
You could let the user with metamask still connect, OR let the user input private key theb inject this new web3 over.
I made mobile app and desktop app from a web app that use this code, work fluently.