As Foern has answered the only way to force users to accept permissions at installation and not runtime is to user an sdk less than 23. This will become difficult to maintain an app over time as api are updated further and the app gradually has deprecated methods.
The difference in what you perceive as "annoyance" to the user is not so great.
The user can save the runtime permissions as default, so the permissions are not required everytime the app is run. This permission can also be revoked at any time by the user. However, there is little difference between accepting the permissions and making them default answers once at runtime than accepting them at installation.
For developers there is some more work to do with runtime permissions, but for users there is supposed to be an added level of protection and autonomy by not having to accept all permissions at installation.
As from the link:
Beginning in Android 6.0 (API level 23), users grant permissions to apps while the app is running, not when they install the app. This approach streamlines the app install process, since the user does not need to grant permissions when they install or update the app. It also gives the user more control over the app's functionality; for example, a user could choose to give a camera app access to the camera but not to the device location. The user can revoke the permissions at any time, by going to the app's Settings screen.