ABBYY RTR SDK рдФрд░ django рдХреЗ рд╕рд╛рде рдПрдВрдбреНрд░реЙрдЗрдб рдерд┐рдВрдЧреНрд╕ рдкрд░ рдЧреНрд░рдВрдереЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдирд╛

рдирдорд╕реНрддреЗ! рдореЗрд░рд╛ рдирд╛рдо рдЕрдЬрд╝рд╛рдд рдХрд▓рд┐рдордХреЛрд╡ рд╣реИ, рдореИрдВ рдПрдкреНрд▓рд╛рдЗрдб рдореИрдереЗрдореЗрдЯрд┐рдХреНрд╕ рдФрд░ рдХрдВрдкреНрдпреВрдЯрд░ рд╕рд╛рдЗрдВрд╕ рд╕рдВрдХрд╛рдп рдХреЗ рджреВрд╕рд░реЗ рд╡рд░реНрд╖ рдХрд╛ рдЫрд╛рддреНрд░ рд╣реВрдБ, рдЬреЛ рд╣рд╛рдпрд░ рд╕реНрдХреВрд▓ рдСрдлрд╝ рдЗрдХреЛрдиреЙрдорд┐рдХреНрд╕ рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдХрд╛ рд╕рдВрдХрд╛рдп рд╣реИ рдФрд░ рдПрдмреАрдмреАрд╡рд╛рдИ рдХреЗ рдореЛрдмрд╛рдЗрд▓ рд╡рд┐рдХрд╛рд╕ рд╡рд┐рднрд╛рдЧ рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖реБ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЕрдкрдиреА рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛, рдЬрд┐рд╕реЗ рдПрдХ рдЧреНрд░реАрд╖реНрдордХрд╛рд▓реАрди рдЗрдВрдЯрд░реНрдирд╢рд┐рдк рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред



рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдХрдиреНрд╡реЗрдпрд░ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЛред рдорд╛рд▓ рдпрд╛ рдХреБрдЫ рд╡рд┐рд╡рд░рдг рдЗрд╕рдХреЗ рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рдкрд╛рда рдХреЛ рдкрд╣рдЪрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ (рд╢рд╛рдпрдж рдпрд╣ рдХреБрдЫ рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ, рдпрд╛ рд╢рд╛рдпрдж рдХреБрдЫ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ)ред рдкрд╛рд░реНрд╕рд▓ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдХрдиреНрд╡реЗрдпрд░ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рджреВрд░ рд╕реЗ рдПрдХ рдСрдкрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЦрд░рд╛рдмреА рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдЙрд╕реЗ рдХреНрдпрд╛ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ? рдПрдВрдбреНрд░реЙрдЗрдб рдерд┐рдВрдЧреНрд╕ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдЙрдкрдХрд░рдг рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдпрд╣ рдореЛрдмрд╛рдЗрд▓ рд╣реИ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рд╡рд╛рдИ-рдлрд╛рдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдордиреЗ рдПрдмреАрдмреАрд╡рд╛рдИ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рд╡реЗ рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ - рдЗрдВрдЯрд░рдиреЗрдЯ рдСрдл рдерд┐рдВрдЧреНрд╕ рдХреА рд╢реНрд░реЗрдгреА рд╕реЗ "рдЧреИрд░-рдорд╛рдирдХ рдЙрдкрдХрд░рдгреЛрдВ" рдкрд░ рдПрдХ рдзрд╛рд░рд╛ рдореЗрдВ рдкрд╛рда рдХреА рдорд╛рдиреНрдпрддрд╛ред рд╣рдо рдЬрд╛рдирдмреВрдЭрдХрд░ рдХрдИ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рд┐рд░реНрдл рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред


Android рдЪреАрдЬреЗрдВ


рдПрдВрдбреНрд░реЙрдЗрдб рдерд┐рдВрдЧреНрд╕ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯ рдирд╛рдордХ рдПрдХ рдЕрджреНрднреБрдд рдЪреАрдЬ Google I / O рд╕рдореНрдореЗрд▓рди рд╕реЗ рд╣рдорд╛рд░реЗ ABBYY рдХрд╛рд░реНрдпрд╛рд▓рдп рдореЗрдВ рдЖрдИред рдЕрдЪреНрдЫрд╛рдИ рдЧрд╛рдпрдм рдирд╣реАрдВ рд╣реБрдИ, рдФрд░ рд╣рдо рдЕрдкрдиреА рдорд╛рдиреНрдпрддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рдЙрдкрдХрд░рдг рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЪрд▓рд╛рдПрдВред рдРрд╕рд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдкрд╛рд▓рди рдХрд░реЗрдВред


рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдпрд╣рд╛рдБ рдкрдврд╝реЗрдВред


рдореЗрд░реЗ рд╣рд╛рде рдореЗрдВ рдХреНрдпрд╛ рдЖрдпрд╛
рдЫрд╡рд┐
рдФрд░ рдкреЛрд╕реНрдЯ рдХреЗ рдЕрдВрдд рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЗрдХрдЯреНрдареЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреНрдпрд╛ рджрд┐рдЦрддрд╛ рд╣реИ


рд╣рдо рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?


рд╣рдо рдПрдВрдбреНрд░реЙрдЗрдб рдерд┐рдВрдЧреНрд╕ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡реЗрджрди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдХреИрдорд░реЗ рд╕реЗ рдЫрд╡рд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛, рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдХреЛ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдкрд╛рда рдФрд░ (рд╕рдордп-рд╕рдордп рдкрд░) рдлрд╝реНрд░реЗрдо рднреЗрдЬреЗрдЧрд╛ рддрд╛рдХрд┐ рд╕рд╢рд░реНрдд рдСрдкрд░реЗрдЯрд░ рд╕рдордЭ рд╕рдХреЗ рдХрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рд╕рд░реНрд╡рд░ django рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред


рдореИрдВ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЬрд▓реНрджрдмрд╛рдЬреА рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрд┐рд╕реА рдирд┐рд╡реЗрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рд╕рд╛рде рд╣реА рдкрдВрдЬреАрдХрд░рдг рдФрд░ рдПрд╕рдПрдордПрд╕ (рдареАрдХ рд╣реИ, рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдкрд░ рдЖрдкрдХреЛ рдЕрднреА рднреА рдкрдВрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдФрд░ рдореБрдлреНрдд рдЦрд╛рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред


рд╣рдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд░реЙрдХреЗрдЯ рд╕рд░реНрд╡рд░


рд╣рдо рдорд╛рди рд▓реЗрдВрдЧреЗ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдореБрдлреНрдд рдореЗрдВ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдЦрд╛рддрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдб рдХреЛ рдЯрд╛рдИ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдмреБрд░рд╛рдИ рдЕрдореЗрдЬрд╝рди, рд╣рдорд╛рд░реЗ рд▓рд╛рдкрд░рд╡рд╛рд╣ рд╣реЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдореЗрдВ рд╕реЗ рдПрдХ рд╢реЗрдХреЗрд▓ рдХреЛ рдХрд╛рдЯ рд▓реЗред рд╣рдо рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдИрд╕реА 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдПрд╕рдПрд╕рдбреА рд╡реЙрд▓реНрдпреВрдо рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЙрдмрдВрдЯреВ рд╕рд░реНрд╡рд░ 18.04 рдПрд▓рдЯреАрдПрд╕ (рдПрдЪрд╡реАрдПрдо) рдкрд░ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдмрдирд╛рдПрдВрдЧреЗред рдЗрд╕ OS рдХреЗ рд▓рд┐рдП рдФрд░ рдПрдХ рдореБрдлреНрдд рдЦрд╛рддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдХреЗрд╡рд▓ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЗрд╕реЗ рдЪреБрдиреЗрдВ (рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ, рд░реИрдо рдХреА рдПрдХ рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ)ред рд╣рдо рдПрдХ ssh рдХреБрдВрдЬреА рдмрдирд╛рдПрдВрдЧреЗ (рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ) рдФрд░ рд╣рдорд╛рд░реА рдорд╢реАрди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╣рдо рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ рдЖрдИрдкреА (рд╕реНрдерд┐рд░ рдЖрдИрдкреА рдЬреИрд╕реА рдХреБрдЫ) рднреА рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рддреБрд░рдВрдд рдЗрд╕реЗ рд╣рдорд╛рд░реА рдорд╢реАрди рд╕реЗ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХ рдЖрдИрдкреА, рдЬреЛ рдХрд┐рд╕реА рднреА рдЖрднрд╛рд╕реА рдорд╢реАрди рд╕реЗ рдмрдВрдзрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдкреИрд╕рд╛ рдЦрд░реНрдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рд╣рдо рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВред рд╣рдо рдорд╢реАрди рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдЯреВрд▓рдХрд┐рдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред


рдкрд╛рдпрдерди рддреАрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреВрд░реНрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдорд╛рдорд▓рд╛ рдЫреЛрдЯреЗ рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


$ sudo apt-get update $ sudo apt-get install python3-pip $ sudo pip3 install virtualenv 

рдХрд░реНрддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рд╣рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред


 $ sudo apt-get install docker.io 

рдЖрдкрдХреЛ рдкреЛрд░реНрдЯ 8000 рдЦреЛрд▓рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡реЗрдм рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред Ssh рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ 22 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЦреБрд▓рд╛ рд╣реИред


рд╣реБрд░реНрд░реЗ! рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреВрд░рд╕реНрде рдХрдВрдкреНрдпреВрдЯрд░ рд╣реИред рд╣рдо рд╕рд░реНрд╡рд░ рдкрд░ рд╕реАрдзреЗ рдХреЛрдб рд▓рд┐рдЦреЗрдВрдЧреЗред


Django (+ рдЪреИрдирд▓)


рдореИрдВрдиреЗ django рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдЫреЛрдЯреА рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреЛ рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд django рдЪреИрдирд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣рдореЗрдВ рд╡реЗрдм рд╕реЙрдХреЗрдЯ (рдЕрд░реНрдерд╛рддреН рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрдЧреА рдХреАрд▓ рдкреГрд╖реНрда рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░реЗрдВ)ред


рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдБ рдЬрд┐рд╕рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЬрдЧрд╣ рджреА рдЬрд╛рдПред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛, django рдЪреИрдирд▓реЛрдВ рдХреЗ рд╕рд╛рде django рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред


 $ mkdir Project $ cd Project $ virtualenv venv $ source venv/bin/activate $ pip install -U channels #       django $ pip install channels_redis #    Redis $ pip install djangorestframework $ django-admin startproject mysite $ cd mysite 

рд╣рдо рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 3 рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдБ рд╣реЛрдВрдЧреАред рдореБрдЦреНрдп рдореЗрдВ рдПрдХ рд╣реА рдирд╛рдо рд╣реЛрдЧрд╛ - mysite (рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛), рдЕрдиреНрдп рджреЛ - рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдФрд░ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ред рдкрд╣рд▓рд╛ рдПрдХ рд╡реЗрдм рдкреЗрдЬ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛, рдФрд░ рджреВрд╕рд░рд╛ - рдЗрд╕реЗ REST API рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред


 $ python3 manage.py startapp streaming $ cd streaming $ rm -r migrations admin.py apps.py models.py tests.py $ cd .. $ python3 manage.py startapp uploading $ cd uploading $ rm -r migrations admin.py apps.py models.py tests.py 

Django рдЪреИрдирд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред WSGI_APPLICATION рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ рдФрд░ ASGI_APPLICATION рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдЬреЛрдбрд╝реЗрдВред рдЕрдм рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред


 # mysite/settings.py # ... # WSGI_APPLICATION = ... ASGI_APPLICATION = 'mysite.routing.application' # ... 

рд╣рдо INSTALLED_APPS рд╕реВрдЪреА рдХреЗ рдореВрд▓реНрдп рдХреЛ рднреА рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред


 # mysite/settings.py # ... INSTALLED_APPS = [ 'channels', 'streaming', 'uploading', 'rest_framework', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] # ... 

рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░


рд╣рдо рдЖрдзрд┐рдХрд╛рд░рд┐рдХ django рдЪреИрдирд▓ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдб рд▓рд┐рдЦреЗрдВрдЧреЗред рд╣рдорд╛рд░реА рдЫреЛрдЯреА рд╕реЗрд╡рд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:


MYIP: 8000 / рдлреНрд░реЗрдо - рдПрдХ рд╡реЗрдм рдкреЗрдЬ рдЬреЛ рдкрд░рд┐рдгрд╛рдо рдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛, рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ, рд╡рд╣ рдкреГрд╖реНрда рдЬрд┐рд╕реЗ рдСрдкрд░реЗрдЯрд░ рджреЗрдЦ рд░рд╣рд╛ рд╣реИ
MYIP: рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдкрд╛рда рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП 8000 / рдЕрдкрд▓реЛрдб / рдЕрдкрд▓реЛрдб / рдЕрдкрд▓реЛрдб / - рдПрдХ рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдкрддрд╛
MYIP: 8000 / рдЕрдкрд▓реЛрдб / рдЕрдкрд▓реЛрдб / рдЕрдкрд▓реЛрдб / - PUT рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдкрддрд╛, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЪрд┐рддреНрд░ рднреЗрдЬрдирд╛


рдЗрд╕ рддрд░реНрдХ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреА urls.py рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред


 # mysite/mysite/urls.py from django.contrib import admin from django.conf.urls import include, url urlpatterns = [ url(r'^frame/', include('streaming.urls')), url(r'^upload/', include('uploading.urls')), ] 

рдЕрдиреНрдп рдПрдкреАрдЖрдИ


рд╣рдо рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдХреЗ рддрд░реНрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред


 # mysite/uploading/urls.py from django.conf.urls import url from rest_framework.urlpatterns import format_suffix_patterns from . import views urlpatterns = [ url(r'^upload_text/$', views.UploadTextView.as_view()), url(r'^upload_image/$', views.UploadImageView.as_view()), ] urlpatterns = format_suffix_patterns(urlpatterns) 

 # mysite/uploading/views.py from django.shortcuts import render from rest_framework.views import APIView from rest_framework.response import Response from channels.layers import get_channel_layer from rest_framework.parsers import FileUploadParser from asgiref.sync import async_to_sync import base64 # Create your views here. class UploadTextView(APIView): def post(self, request, format=None): message = request.query_params['message'] if not message: raise ParseError("Empty content") channel_layer = get_channel_layer() async_to_sync(channel_layer.group_send)("chat", { "type": "chat.message", "message": message, }) return Response({'status': 'ok'}) class UploadImageView(APIView): parser_class = (FileUploadParser,) def put(self, request, format=None): if 'file' not in request.data: raise ParseError("Empty content") f = request.data['file'] channel_layer = get_channel_layer() async_to_sync(channel_layer.group_send)("chat", { "type": "chat.message", "image64": base64.b64encode(f.read()).decode("ascii"), }) return Response({'status': 'ok'}) 

рд╡реЗрдм рдкреЗрдЬ


рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдПрдХ рдкреГрд╖реНрда рдкрд░ рдлрд┐рдЯ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рддрд░реНрдХ рд╕рд░рд▓ рд╣реЛрдЧрд╛ред


 # mysite/streaming/urls.py from django.conf.urls import url from . import views urlpatterns = [ url(r'^', views.index, name='index'), ] 

 # mysite/streaming/views.py from django.shortcuts import render from django.utils.safestring import mark_safe import json # Create your views here. def index(request): return render(request, 'index.html', {}) 

рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ HTML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдореЗрдВ рдПрдХ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдордЧреНрд░реА рд╕реЗ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛрдЧреАред


 <!-- mysite/streaming/templates/index.html --> <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>Live from Android Things</title> </head> <body> <textarea id="chat-log" cols="100" rows="20"></textarea><br/> <img id="frame"> </body> <script> var chatSocket = new WebSocket( 'ws://' + window.location.host + '/ws/chat/'); chatSocket.onmessage = function(e) { var data = JSON.parse(e.data); var message = data['message']; var image64 = data['image64']; if (image64) { document.querySelector('#frame').setAttribute( 'src', 'data:image/png;base64,' + image64 ); } else if (message) { document.querySelector('#chat-log').value += (message + '\n'); } }; chatSocket.onclose = function(e) { console.error('Chat socket closed unexpectedly'); }; </script> </html> 

рд░реВрдЯрд┐рдВрдЧ, рд╕реЙрдХреЗрдЯреНрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ


рд░реВрд╕реА рдореЗрдВ рд░реВрдЯрд┐рдВрдЧ рд╢рдмреНрдж рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрд╡рд╛рдж рдХреНрдпрд╛ рд╣реИ? рдЖрдЗрдП рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЛ рд╣рдорд╛рд░реЗ рд╕рд┐рд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ (рдпрд╛ рдЙрд╕рдХреЗ) рд╕реЗрдЯ рдХрд░реЗрдВред


 # mysite/mysite/settings.py # ... ALLOWED_HOSTS = ['*'] #  []  ['*'],    # ... CHANNEL_LAYERS = { 'default': { 'BACKEND': 'channels_redis.core.RedisChannelLayer', 'CONFIG': { "hosts": [('127.0.0.1', 6379)], }, }, } 

рдЕрдм рдЖрдкрдХреЛ "рдлрд╝реЙрд░рд╡рд░реНрдбрд┐рдВрдЧ" рд▓реЙрдЬрд┐рдХ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ (рд░рд╛рдЙрдЯрд┐рдВрдЧ рдереНрд░реВ рдлрд╝рд╛рдЗрд▓реЗрдВ urls.py рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рдХреЗрд╡рд▓ рдЕрдм рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП)ред


 # mysite/mysite/routing.py from channels.auth import AuthMiddlewareStack from channels.routing import ProtocolTypeRouter, URLRouter import streaming.routing application = ProtocolTypeRouter({ # (http->django views is added by default) 'websocket': AuthMiddlewareStack( URLRouter( streaming.routing.websocket_urlpatterns ) ), }) 

 # mysite/streaming/routing.py from django.conf.urls import url from . import consumers websocket_urlpatterns = [ url(r'^ws/chat/$', consumers.FrameConsumer), ] 

рдФрд░ рдЕрдм рд╣рдо рдЦреБрдж рд╣реА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рдХрдВрдЬреНрдпреВрдорд░рд╣реЛрдо рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ


 # mysite/streaming/consumers.py from asgiref.sync import async_to_sync from channels.generic.websocket import WebsocketConsumer, JsonWebsocketConsumer import json class FrameConsumer(WebsocketConsumer): def connect(self): self.room_group_name = 'chat' # Join room group async_to_sync(self.channel_layer.group_add)( self.room_group_name, self.channel_name ) self.accept() def disconnect(self, close_code): # Leave room group async_to_sync(self.channel_layer.group_discard)( self.room_group_name, self.channel_name ) # Receive message from WebSocket def receive(self, text_data): text_data_json = json.loads(text_data) message = text_data_json['message'] # Send message to room group async_to_sync(self.channel_layer.group_send)( self.room_group_name, { 'type': 'chat_message', 'message': message } ) # Receive message from room group def chat_message(self, event): if 'message' in event: # Send message to WebSocket self.send(text_data=json.dumps({ 'message': event['message'] })) elif 'image64' in event: self.send(text_data=json.dumps({ 'image64': event['image64'] })) 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдкрд╕реАрдиреЗ рд╕реЗ рддрд░ рд╣рдереЗрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВред


 $ docker run -p 6379:6379 -d redis:2.8 $ python manage.py runserver 0.0.0.0:8000 

рдФрд░ рдЕрдм Android рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рд╣рдо рдкрд╛рдареНрдп рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдмреАрдмреАрд╡рд╛рдИ рд╕реЗ рдЖрд░рдЯреАрдЖрд░ рдПрд╕рдбреАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдкреИрдХ рдЖрд░рдЯреАрдЖрд░ рдПрд╕рдбреАрдХреЗ рдХреЛ рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рд╣рдо рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдкрд┐рдЫрд▓реЗ рд▓рд┐рдВрдХ (/ рдирдореВрдирд╛-рдЯреЗрдХреНрд╕реНрдЯрдХреИрдкрдЪрд░) рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдПрдХ рдирдореВрдирд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдЧрд╛ред рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдВрдбреНрд░реЙрдЗрдб рдерд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрд╡реЗрджрди рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рднрд╛рдЧреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджреЗрдВрдЧреЗред


рд▓рд╛рдЗрдмреНрд░реЗрд░реА .AR рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рд╕рдВрдЧреНрд░рд╣ рдХреА lib рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ, рд╣рдо рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдХреА рд╕рдВрдкрддреНрддрд┐ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ (рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлрд╛рдЗрд▓реЗрдВ)ред рд╡рд╣рд╛рдВ рд╣рдо рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдЖрд╡реЗрджрди рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред


рдПрдмреАрдмреАрд╡рд╛рдИ рдЖрд░рдЯреАрдЖрд░ рдПрд╕рдбреАрдХреЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЯрд╛рдЗрдк рдЗрдВрдЬрди рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП ITextCaptureService рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВрдЧреЗред


 try { mEngine = Engine.load(this, LICENSE_FILE_NAME); mTextCaptureService = mEngine.createTextCaptureService(textCaptureCallback); return true; } // ... 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ ITextCaptureService.Callback рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕реЗ рд╕реАрдзреЗ рд╣рдорд╛рд░реЗ MainActivity рдХреНрд▓рд╛рд╕ рдореЗрдВ рдмрдирд╛рдПрдВ, рдЗрд╕реЗ 3 рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


 private ITextCaptureService.Callback textCaptureCallback = new ITextCaptureService.Callback() { @Override public void onRequestLatestFrame(byte[] buffer) { //  ,       . //    . mCamera.addCallbackBuffer(buffer); } @Override public void onFrameProcessed( ITextCaptureService.TextLine[] lines, ITextCaptureService.ResultStabilityStatus resultStatus, ITextCaptureService.Warning warning) { //      ,    if (resultStatus.ordinal() >= 3) { //   ,     mSurfaceViewWithOverlay.setLines(lines, resultStatus); } else { //  ,     mSurfaceViewWithOverlay.setLines(null, ITextCaptureService.ResultStabilityStatus.NotReady); } //  warnings // ... } @Override public void onError(Exception e) { //    } }; 

рд╣рдордиреЗ рдХреИрдорд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдлреНрд░реЗрдо рдХреА рдкреНрд░рд╛рдкреНрддрд┐ рдХреЛ рд╕реМрдВрдк рджрд┐рдпрд╛ рд╣реИред рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред


 private Camera.PreviewCallback cameraPreviewCallback = new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { //     (    ) if (!mIsUploading) { mIsUploading = true; //    new UploadImageTask(mCameraPreviewSize.width, mCameraPreviewSize.height).execute(data); } //     mTextCaptureService.submitRequestedFrame(data); } }; 

рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреБрдЫ рд╡рд░реНрдЧреЛрдВ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдЕрдкрд▓реЛрдбрд░ рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдкрд░ рдЕрдкрдирд╛ рдХрд╛рдо рд╕реМрдВрдкреЗрдВрдЧреЗред


 public static class UploadTextTask extends AsyncTask<String, Void, Void> { @Override protected Void doInBackground(String... params) { mUploader.uploadText(params[0]); return null; } } public static class UploadImageTask extends AsyncTask<byte[], Void, Void> { private int mCameraPreviewWidth; private int mCameraPreviewHeight; public UploadImageTask(int width, int height) { mCameraPreviewWidth = width; mCameraPreviewHeight = height; } @Override protected Void doInBackground(final byte[]... params) { byte[] jpegBytes = convertToJpegBytes(params[0]); if (jpegBytes != null) { mUploader.uploadImage(jpegBytes); } return null; } private byte[] convertToJpegBytes(byte[] rawBytes) { YuvImage yuvImage = new YuvImage( rawBytes, ImageFormat.NV21, mCameraPreviewWidth, mCameraPreviewHeight, null ); try (ByteArrayOutputStream os = new ByteArrayOutputStream()) { yuvImage.compressToJpeg( new Rect(0, 0, mCameraPreviewWidth, mCameraPreviewHeight), 40, os ); return os.toByteArray(); } catch (IOException e) { Log.d(TAG, "compress error"); return null; } } // ... } 

рдЕрдкрд▓реЛрдбрд░ рд╡рд░реНрдЧ рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ OkHttp3 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдкрд░рд┐рдгрд╛рдо


рд╣рдореЗрдВ ABBYY рд╕реЗ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдПрдХ рдХрд╛рдордХрд╛рдЬреА рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдСрдл рдерд┐рдВрдЧреНрд╕ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдХреНрдпрд╛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ?


рдПрдХ рдПрдХрддреНрд░рд┐рдд рдЙрдкрдХрд░рдг рдФрд░ рдореЗрд░реЗ рдирд┐рдпреЛрдХреНрддрд╛ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рджреЗрд╢реА рд╡рд┐рдЬреНрдЮрд╛рдкрди
рдЫрд╡рд┐


рдкрд╛рда рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реИ
рдЫрд╡рд┐


рдХрдИ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдЕрд╡рд▓реЛрдХрди рдХреЗ рд╕рд╛рде рд╕реЗрд▓реНрдлреА рдкреИрдиреЛрд░рдорд╛
рдЫрд╡рд┐


Vidos, рдпрд╣ рд╕рдм рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдХреИрд╕реЗ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ



рдЧрд┐рддреБрдм рдкрд░ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА:


тЖТ AndroidThingsTextRecognition-Backend
тЖТ AndroidThingsTextRecognition-Android


рд▓реЛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЛ!

Source: https://habr.com/ru/post/hi432514/


All Articles