I think you have two problems:

Non-symmetric control points
====

Initially you start with equal distances between p0 to p1 and p1 to p2. If the tolerance angle between the line segments is not met, you move p1 and p2 forward, but keep p0 where it was. This increases the distance between p0 to p1 while keeping the distance between p1 to p2 the same. When you create a curve using p1 as the control points, it can be heavily biased towards p2 depending on how many iterations have passed since the last curve. If you would move p2 twice the amount than p1, you would get even distances between the points.

Quadratic curves
====

As mentioned in other answers as well, quadratic curve is not very good for this case. Adjacent curves you create should share a **control point and a tangent**. When your input data is just points, [Catmull-Rom Spline][1] is a good choice for that purpose. It's a cubic Hermite curve, where the tangents for the control points are calculated from previous and next points.

The Path API in Android supports Bézier curves, which are a little different than Hermite curves regarding parameters. Fortunately Hermite curves can be converted to Bézier curves. [Here][2] is the first example code I found when Googling. [This Stackoverflow answer][3] also seems to give the formula.


You also mentioned the problem of sharp edges. With the input data you have, it's impossible to detect if there is an actual sharp corner or just a very steep curve. If this becomes a problem, you can make the iteration more adaptive by increasing / decreasing the step on-the-fly as needed.

  [1]: http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Catmull.E2.80.93Rom_spline
  [2]: http://processingjs.nihongoresources.com/code%20repository/?get=Catmull-Rom-to-Bezier
  [3]: http://stackoverflow.com/a/3559116/160539