Improving an auto-correlation based guitar pitch detector I've seen many questions on this forum regarding pitch detection for musical instruments (commonly guitar), and spent a while reading through the answers to create a basic implementation of auto-correlation to make an Android guitar tuner.

This is the algorithm I'm using (implemented in Java on an Android phone):
1) Record a short[4096] array of raw audio data from an Android phone's microphone at 48kHz sample rate
2) Apply a Hanning window to the raw audio data
3) Zero-pad the result to double the length (8192)
4) Apply auto-correlation with FFTs
5) Normalize the auto-correlation result
6) Get the periodicity from the peak bin indexes

My problem is that with an actual guitar it is not robust (around 50% accurate at best), and I don't know how to filter noise either (without any loud noise, just ambient white noise, it outputs garbage frequencies). 

It fares much better when I whistle at it, or play a generated sine tone from a computer, but that's expected.

In my search for ways to improve my implementation, many answers (on this forum and others) usually point to using a better algorithm like YIN, but I think its more likely that I've made a mistake in my implementation.

Does anything seem obviously incorrect from the algorithm I posted? Are there tweaks I can apply? 

1) Increase the Android microphone sensitivty
2) Band-pass the raw data before the algorithm
3) Record more samples
4) ??? And does anybody have any idea how I could filter out noise by using the auto-correlation result?

Thanks in advance.
I realized I had forgotten to make an update to this.

I ended up following @robert bristow-johnson's recommendations in the comments.

I used time-domain McLeod Pitch Method in a live application (records audio in a loop) which works very well.

You can see the source code here:
https://github.com/sevagh/Pitcha