What you are trying to do is impossible, at least from an engineering standpoint. You can use various tools to obfuscate the secrets stored in your application (e.g. ProGuard), but ultimately, no matter what mechanism you use to obfuscate your secrets, they must be accessible to the device that uses them. You could also take other steps to increase the time required to reverse engineering your application, such as frequently changing your API in ways that are likely to break reverse-engineered clients, or pushing mandatory updates that change the secrets and the mechanism used to obfuscate those secrets.
Nevertheless, no matter what you do, a sufficiently motivated user will be able to obtain any secret you distribute in your application.
Legally, you have more options. You may be able to make it impossible to legally access your API from an unauthorized application by using an appropriate EULA; see Blizzard v BnetD. If you own the copyright on the data your service provides, you may be able to prevent third-parties from reproducing it elsewhere without your permission, or charge them for doing so. There are probably other legal options too; you would need to consult a lawyer.
But why bother? Before you begin down this path, perhaps you should ask yourself why you are trying to prevent other applications from accessing your API in the first place. If users find your service valuable but are sufficiently unhappy with the client you provide that they are willing to install a third-party application to access your service, perhaps you should focus on improving your own client, rather than forcing your users to use a client they clearly do not prefer.