<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF164%3A_Android</id>
		<title>LXF164: Android - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF164%3A_Android"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF164:_Android&amp;action=history"/>
		<updated>2026-05-13T21:55:05Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF164:_Android&amp;diff=18932&amp;oldid=prev</id>
		<title>Olkol: /* Соз­да­ние сним­ка */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF164:_Android&amp;diff=18932&amp;oldid=prev"/>
				<updated>2018-10-26T13:18:16Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Соз­да­ние сним­ка&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 13:18, 26 октября 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 594:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 594:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Я рас­ска­зы­ва­ла о нем в пре­ды­ду­щей ста­тье; по су­ти это вспо­мо­га­тель­ный класс, от ко­то­ро­го мож­но унас­ле­до­вать­ся, что­бы лег­ко за­пустить про­цесс в фо­но­вой нити (обыч­но все, что за­пуска­ет­ся в ко­де, ра­бо­та­ет в од­ной основ­ной нити. Помните, что ин­тер­фейс Android небезо­па­сен с точ­ки зрения нитей, по­это­му вы­пол­няй­те в фоне толь­ко за­да­чи, не об­нов­ляю­щие гра­фи­че­­ский ин­тер­фейс!). В дан­ном слу­чае мы про­сто вы­но­сим в фон код со­хранения фай­ла, что­бы по­втор­но пе­ре­за­пустить про­смотр сра­зу по­сле соз­дания сним­ка.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Я рас­ска­зы­ва­ла о нем в пре­ды­ду­щей ста­тье; по су­ти это вспо­мо­га­тель­ный класс, от ко­то­ро­го мож­но унас­ле­до­вать­ся, что­бы лег­ко за­пустить про­цесс в фо­но­вой нити (обыч­но все, что за­пуска­ет­ся в ко­де, ра­бо­та­ет в од­ной основ­ной нити. Помните, что ин­тер­фейс Android небезо­па­сен с точ­ки зрения нитей, по­это­му вы­пол­няй­те в фоне толь­ко за­да­чи, не об­нов­ляю­щие гра­фи­че­­ский ин­тер­фейс!). В дан­ном слу­чае мы про­сто вы­но­сим в фон код со­хранения фай­ла, что­бы по­втор­но пе­ре­за­пустить про­смотр сра­зу по­сле соз­дания сним­ка.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|left|Заголовок= |Ширина=98%|Содержание= &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Съем­ка ви­део&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|left|Заголовок= &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Съем­ка ви­део&lt;/ins&gt;|Ширина=98%|Содержание= Ка­ме­рой мож­но снимать не толь­ко фо­то­гра­фии, но и ви­део. Ес­ли вы хо­ти­те это де­лать, сна­ча­ла уста­но­ви­те пра­во android.permision.RECORD_AUDIO uses-permission в AndroidManifest.xml.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Ка­ме­рой мож­но снимать не толь­ко фо­то­гра­фии, но и ви­део. Ес­ли вы хо­ти­те это де­лать, сна­ча­ла уста­но­ви­те пра­во android.permision.RECORD_AUDIO uses-permission в AndroidManifest.xml.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Съем­ка ви­део сложнее съем­ки фо­то­гра­фий, и для нее нуж­но вы­полнить сле­дую­щие дей­ст­вия в ука­зан­ном по­ряд­ке:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Съем­ка ви­део сложнее съем­ки фо­то­гра­фий, и для нее нуж­но вы­полнить сле­дую­щие дей­ст­вия в ука­зан­ном по­ряд­ке:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF164:_Android&amp;diff=18931&amp;oldid=prev</id>
		<title>Olkol: /* Соз­да­ние сним­ка */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF164:_Android&amp;diff=18931&amp;oldid=prev"/>
				<updated>2018-10-26T13:15:49Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Соз­да­ние сним­ка&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 13:15, 26 октября 2018&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 594:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 594:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Я рас­ска­зы­ва­ла о нем в пре­ды­ду­щей ста­тье; по су­ти это вспо­мо­га­тель­ный класс, от ко­то­ро­го мож­но унас­ле­до­вать­ся, что­бы лег­ко за­пустить про­цесс в фо­но­вой нити (обыч­но все, что за­пуска­ет­ся в ко­де, ра­бо­та­ет в од­ной основ­ной нити. Помните, что ин­тер­фейс Android небезо­па­сен с точ­ки зрения нитей, по­это­му вы­пол­няй­те в фоне толь­ко за­да­чи, не об­нов­ляю­щие гра­фи­че­­ский ин­тер­фейс!). В дан­ном слу­чае мы про­сто вы­но­сим в фон код со­хранения фай­ла, что­бы по­втор­но пе­ре­за­пустить про­смотр сра­зу по­сле соз­дания сним­ка.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Я рас­ска­зы­ва­ла о нем в пре­ды­ду­щей ста­тье; по су­ти это вспо­мо­га­тель­ный класс, от ко­то­ро­го мож­но унас­ле­до­вать­ся, что­бы лег­ко за­пустить про­цесс в фо­но­вой нити (обыч­но все, что за­пуска­ет­ся в ко­де, ра­бо­та­ет в од­ной основ­ной нити. Помните, что ин­тер­фейс Android небезо­па­сен с точ­ки зрения нитей, по­это­му вы­пол­няй­те в фоне толь­ко за­да­чи, не об­нов­ляю­щие гра­фи­че­­ский ин­тер­фейс!). В дан­ном слу­чае мы про­сто вы­но­сим в фон код со­хранения фай­ла, что­бы по­втор­но пе­ре­за­пустить про­смотр сра­зу по­сле соз­дания сним­ка.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|left|Заголовок= |Ширина=&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;10&lt;/del&gt;%|Содержание= Съем­ка ви­део&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|left|Заголовок= |Ширина=&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;98&lt;/ins&gt;%|Содержание= Съем­ка ви­део&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Ка­ме­рой мож­но снимать не толь­ко фо­то­гра­фии, но и ви­део. Ес­ли вы хо­ти­те это де­лать, сна­ча­ла уста­но­ви­те пра­во android.permision.RECORD_AUDIO uses-permission в AndroidManifest.xml.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Ка­ме­рой мож­но снимать не толь­ко фо­то­гра­фии, но и ви­део. Ес­ли вы хо­ти­те это де­лать, сна­ча­ла уста­но­ви­те пра­во android.permision.RECORD_AUDIO uses-permission в AndroidManifest.xml.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 715:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 715:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Тогда вы смо­же­те за­пускать и оста­нав­ли­вать запись од­ной кноп­кой. За­дай­те все на­строй­ки, за­тем за­пусти­те MediaRecorder, и го­то­во. Об­ра­ти­те внимание, что файл про­сто со­хра­ня­ет­ся на внешний но­си­тель; что­бы сде­лать с ним еще что-нибудь, нуж­но до­пи­сать код.}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Тогда вы смо­же­те за­пускать и оста­нав­ли­вать запись од­ной кноп­кой. За­дай­те все на­строй­ки, за­тем за­пусти­те MediaRecorder, и го­то­во. Об­ра­ти­те внимание, что файл про­сто со­хра­ня­ет­ся на внешний но­си­тель; что­бы сде­лать с ним еще что-нибудь, нуж­но до­пи­сать код.}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt; &lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;===Воз­мож­но­сти ка­ме­ры и эф­фек­ты===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;===Воз­мож­но­сти ка­ме­ры и эф­фек­ты===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF164:_Android&amp;diff=18930&amp;oldid=prev</id>
		<title>Olkol в 13:12, 26 октября 2018</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF164:_Android&amp;diff=18930&amp;oldid=prev"/>
				<updated>2018-10-26T13:12:34Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;http://wiki.linuxformat.ru/wiki/index.php?title=LXF164:_Android&amp;amp;diff=18930&amp;amp;oldid=18929&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF164:_Android&amp;diff=18929&amp;oldid=prev</id>
		<title>Olkol: Новая страница: «Категория: Постоянные рубрики   Категория: Программирование   Категория: Андроид   …»</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF164:_Android&amp;diff=18929&amp;oldid=prev"/>
				<updated>2018-10-26T12:19:38Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «&lt;a href=&quot;/wiki/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9F%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%BD%D1%8B%D0%B5_%D1%80%D1%83%D0%B1%D1%80%D0%B8%D0%BA%D0%B8&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Категория:Постоянные рубрики (страница не существует)&quot;&gt;Категория: Постоянные рубрики&lt;/a&gt;   &lt;a href=&quot;/wiki/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Категория:Программирование (страница не существует)&quot;&gt;Категория: Программирование&lt;/a&gt;   &lt;a href=&quot;/wiki/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%90%D0%BD%D0%B4%D1%80%D0%BE%D0%B8%D0%B4&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Категория:Андроид (страница не существует)&quot;&gt;Категория: Андроид&lt;/a&gt;   …»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Категория: Постоянные рубрики]]  &lt;br /&gt;
[[Категория: Программирование]]  &lt;br /&gt;
[[Категория: Андроид]]  &lt;br /&gt;
&lt;br /&gt;
'''Android'''&lt;br /&gt;
&lt;br /&gt;
'''Программирование: Взаимодействие с web-камерой телефона'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Де­ла­ем сним­ки ==&lt;br /&gt;
''Не нра­вит­ся про­грам­ма для ка­ме­ры в сво­ем те­ле­фоне? Есть идея про­грам­мы для ра­бо­ты с фо­то? Джуль­ет­та Кемп зна­ко­мит с Android Camera API.''&lt;br /&gt;
[[Файл:LXF160.code_android.expert.png‎ |left |100px |thumb|'''Наш эксперт''' Джуль­ет­та Кемп еще пом­нит вре­ме­на, ко­гда в фо­то­ап­па­ра­тах бы­ла на­стоя­щая плен­ка. Сей­час она де­ла­ет гораздо поболее сним­ков, чем то­гда.]] &lt;br /&gt;
&lt;br /&gt;
В по­дав­ляю­щем боль­шин­ст­ве те­ле­фо­нов с Android есть встро­ен­ные ка­ме­ры, и с раз­ви­ти­ем тех­но­ло­гий они ста­но­вят­ся все удобнее. Про­грамм, ко­то­рые так или ина­че ра­бо­та­ют с ка­ме­рой, ве­ли­кое мно­же­ст­во, и пре­достав­ляе­мое Android API мак­си­маль­но уп­ро­ща­ет эту за­да­чу.&lt;br /&gt;
&lt;br /&gt;
Ес­ли вам ну­жен все­го-то один снимок, воз­мож­но, про­ще восполь­зо­вать­ся На­ме­рением [Intent] для ак­ти­ва­ции встро­ен­ной ка­ме­ры (см. врез­ку внизу), но ес­ли вам нуж­но боль­ше ры­ча­гов управ­ления, мож­но на­пи­сать соб­ст­вен­ное За­ня­тие [Activity] Camera.&lt;br /&gt;
&lt;br /&gt;
На на­шем уро­ке мы соз­да­дим За­ня­тие, ко­то­рое про­сто ис­поль­зу­ет ка­ме­ру, но, ра­зу­ме­ет­ся, ничто не ме­ша­ет соз­дать при­ло­жение с дру­гим глав­ным За­ня­ти­ем, где за­од­но бу­дет и За­ня­тие для ка­ме­ры, вы­зы­вае­мое при необ­хо­ди­мо­сти.&lt;br /&gt;
&lt;br /&gt;
===Под­го­тов­ка ка­ме­ры===&lt;br /&gt;
&lt;br /&gt;
Пре­ж­де чем пи­сать код, сле­ду­ет объ­я­вить тре­бо­ва­ния для ка­ме­ры в AndroidManifest.xml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;manifest .... &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uses-permission android:name=”android.permission.CAMERA” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uses-feature android:name=”android.hardware.camera” /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ес­ли вы не со­би­рае­тесь со­хра­нять изо­бра­жения, WRITE_EXTERNAL_STORAGE не по­на­до­бит­ся (но так как мы поз­же это сде­ла­ем, то до­ба­вим ее сра­зу). Ди­рек­ти­ва uses-feature оз­на­ча­ет, что для уста­нов­ки при­ло­жения в те­ле­фоне обя­за­тель­но долж­на быть ка­ме­ра. Ес­ли ка­ме­ра – толь­ко часть ва­шей про­грам­мы, и поль­зо­ва­те­ли пре­крас­но смо­гут ра­бо­тать с про­грам­мой и без нее, до­бавь­те android:required=“false” к этой стро­ке. Так­же мож­но за­дать ха­рак­те­ри­сти­ки ка­ме­ры; бо­лее под­роб­но они опи­са­ны в од­ном из сле­дую­щих раз­де­лов.&lt;br /&gt;
&lt;br /&gt;
Те­перь мож­но про­дол­жить с ко­дом пер­во­на­чаль­ной на­строй­ки, в ко­то­ром мы впер­вые по­лу­ча­ем эк­зем­п­ляр объ­ек­та ка­ме­ры. Ме­тод onCreate() в MyCameraActivity дол­жен вы­гля­деть так:&lt;br /&gt;
&lt;br /&gt;
@Override public void onCreate(Bundle savedInstanceState){&lt;br /&gt;
&lt;br /&gt;
super.onCreate(savedInstanceState);&lt;br /&gt;
&lt;br /&gt;
if (!checkCameraExists(this)) {&lt;br /&gt;
&lt;br /&gt;
Toast.makeText(this, “Увы, ка­ме­ры нет!”, Toast.LENGTH_LONG);&lt;br /&gt;
&lt;br /&gt;
finish();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
camera = getCameraInstance();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Один из па­ра­мет­ров ма­ни­фе­ста тре­бу­ет обя­за­тель­но­го на­ли­чия ка­ме­ры на уст­рой­ст­ве, но ее на­ли­чие сто­ит про­ве­рить и здесь. Ме­тод checkCameraExists() прост:&lt;br /&gt;
&lt;br /&gt;
private boolean checkCameraExists(Context c) {&lt;br /&gt;
&lt;br /&gt;
if (c.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {&lt;br /&gt;
&lt;br /&gt;
return true;&lt;br /&gt;
&lt;br /&gt;
} else {&lt;br /&gt;
&lt;br /&gt;
return false;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Ме­тод getCameraInstance() не­на­мно­го слож­нее:&lt;br /&gt;
&lt;br /&gt;
private Camera getCameraInstance() {&lt;br /&gt;
&lt;br /&gt;
Camera c = null;&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
&lt;br /&gt;
c = Camera.open();&lt;br /&gt;
&lt;br /&gt;
} catch (Exception e) {&lt;br /&gt;
&lt;br /&gt;
Toast.makeText(this, “Увы, ка­ме­ры нет!”, Toast.LENGTH_LONG);&lt;br /&gt;
&lt;br /&gt;
Log.e(TAG, “Нет ка­ме­ры: ис­клю­че­ние “ + e.getMessage());&lt;br /&gt;
&lt;br /&gt;
e.getStackTrace();&lt;br /&gt;
&lt;br /&gt;
finish();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return c;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Ме­тод Camera.open() об­ра­ща­ет­ся к пер­вой ка­ме­ре на задней по­верх­но­сти уст­рой­ст­ва.&lt;br /&gt;
&lt;br /&gt;
Ка­мер на уст­рой­ст­вах Android мо­жет быть несколь­ко; для досту­па к кон­крет­ной ка­ме­ре восполь­зуй­тесь ме­то­дом Camera.open(int cameraId). Ме­тод Camera.getNumberOfCameras() вернет ко­ли­че­­ст­во ка­мер уст­рой­ст­ва, а ме­тод Camera. getCameraInfo() – ин­фор­ма­цию о за­дан­ной ка­ме­ре. Для боль­шин­ст­ва за­дач нам по­дой­дет пер­вая ка­ме­ра на задней по­верх­но­сти уст­рой­ст­ва.&lt;br /&gt;
&lt;br /&gt;
В сле­дую­щих раз­де­лах мы зай­мем­ся про­смот­ром изо­бра­жения с ка­ме­ры и соз­данием сним­ка. Но пе­ред этим нуж­но сде­лать еще од­ну важ­ную вещь: за­кон­чив ра­бо­ту с ка­ме­рой, осво­бо­ди­те ее.&lt;br /&gt;
&lt;br /&gt;
Ина­че дру­гие про­цес­сы не смо­гут по­лу­чить доступ к ка­ме­ре – это пло­хая прак­ти­ка; кро­ме то­го, это обес­по­ко­ит поль­зо­ва­те­лей.&lt;br /&gt;
&lt;br /&gt;
Внесем нуж­ные из­менения в ме­тод onPause():&lt;br /&gt;
&lt;br /&gt;
@Override protected void onPause() {&lt;br /&gt;
&lt;br /&gt;
super.onPause();&lt;br /&gt;
&lt;br /&gt;
releaseCamera();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
private void releaseCamera() {&lt;br /&gt;
&lt;br /&gt;
if (camera != null) {&lt;br /&gt;
&lt;br /&gt;
camera.release();&lt;br /&gt;
&lt;br /&gt;
camera = null;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Override protected void onResume() {&lt;br /&gt;
&lt;br /&gt;
if (camera == null) {&lt;br /&gt;
&lt;br /&gt;
camera.getCameraInstance();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
super.onResume();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Когда мы соз­дадим ко­д про­смот­ра изо­бра­жения с ка­ме­ры, данный ме­тод при­дет­ся несколько усложнить, но мы зай­мем­ся этим по­том. А по­ка вам важнее все­го помнить, что следует обязательно осво­бо­ждать ка­ме­ру, когда наше при­ло­жение приоста­нав­ли­ва­ет­ся.&lt;br /&gt;
&lt;br /&gt;
===Соз­да­ем бы­ст­рый сни­мок===&lt;br /&gt;
&lt;br /&gt;
Ес­ли нуж­но сде­лать бы­ст­рый сни­мок, при­го­дит­ся На­ме­ре­ние:&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);&lt;br /&gt;
&lt;br /&gt;
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);&lt;br /&gt;
&lt;br /&gt;
i.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);&lt;br /&gt;
&lt;br /&gt;
startActivityForResult(i, CAPTURE_IMAGE_ACTIVITY_REQ);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
protected Uri getOutputMediaFileUri(int type) {&lt;br /&gt;
&lt;br /&gt;
// См. код в ос­нов­ном тек­сте для getOutputMediaFile()&lt;br /&gt;
&lt;br /&gt;
return Uri.fromFile(getOutputMediaFile(type));&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
По­мес­ти­те пер­вый фраг­мент ко­да в под­хо­дя­щее ме­сто; мож­но свя­зать его с кноп­кой, по­мес­тив в ме­тод onClick() (как в ко­де на на­шем DVD) или сде­лав пунк­том ме­ню. В этом фраг­мен­те ко­да соз­да­ет­ся но­вое На­ме­рение – на­ме­рение по умол­чанию для соз­дания сним­ка – и оно свя­зы­ва­ет­ся с URI, ука­зы­ваю­щим, где со­хранить ре­зуль­ти­рую­щее изо­бра­жение. За­тем мы за­пуска­ем На­ме­рение для за­пуска За­ня­тия. Нам так­же нуж­но об­ра­бо­тать ре­зуль­тат:&lt;br /&gt;
&lt;br /&gt;
protected void onActivityResult(int requestCode, int resultCode, Intent data) {&lt;br /&gt;
&lt;br /&gt;
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQ) {&lt;br /&gt;
&lt;br /&gt;
if (resultCode == RESULT_OK) {&lt;br /&gt;
&lt;br /&gt;
if (data == null) {&lt;br /&gt;
&lt;br /&gt;
// Здесь за­ме­че­на ошиб­ка! Сни­мок дол­жен со­хра­нить­ся в fileUri&lt;br /&gt;
&lt;br /&gt;
Toast.makeText(this, “Сни­мок ус­пеш­но со­хра­нен”,&lt;br /&gt;
&lt;br /&gt;
Toast.LENGTH_LONG).show();&lt;br /&gt;
&lt;br /&gt;
} else {&lt;br /&gt;
&lt;br /&gt;
Toast.makeText(this, “Сни­мок ус­пеш­но со­хра­нен: “ + data.getData(),&lt;br /&gt;
&lt;br /&gt;
Toast.LENGTH_LONG).show();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Здесь вы мо­же­те сде­лать что-ни­будь еще...&lt;br /&gt;
&lt;br /&gt;
} else if (resultCode == RESULT_CANCELED){&lt;br /&gt;
&lt;br /&gt;
// Поль­зо­ва­тель от­ме­нил опе­ра­цию; ни­че­го не де­ла­ем&lt;br /&gt;
&lt;br /&gt;
} else {&lt;br /&gt;
&lt;br /&gt;
Toast.makeText(this, “От­каз вы­зо­ва за­хва­та изо­бра­же­ния!”,&lt;br /&gt;
&lt;br /&gt;
Toast.LENGTH_LONG).show();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
На прак­ти­ке вы, на­вер­ное, за­хо­ти­те как-то об­ра­бо­тать изо­бра­жение. В неко­то­рых уст­рой­ст­вах за­ме­че­на ошиб­ка, свя­зан­ная с со­хранением изо­бра­жения по­сред­ст­вом ПО ка­ме­ры. URI изо­бра­жения дол­жен быть воз­вра­щен вме­сте с На­ме­рением. Од­на­ко иногда воз­вра­ща­ет­ся пустое На­ме­рение, хо­тя файл был со­хранен пра­виль­но. Что­бы обой­ти эту про­бле­му, со­храните URi изо­бра­жения, ко­то­рый вы от­прав­ля­ли с На­ме­рением, и сно­ва восполь­зуй­тесь им при по­лу­чении успеш­но­го ре­зуль­та­та.&lt;br /&gt;
&lt;br /&gt;
===Про­смотр изо­бра­же­ния с ка­ме­ры===&lt;br /&gt;
{{Врезка|right|Заголовок= Скорая помощь|Ширина=10%|Содержание= При по­во­ро­те ка­ме­ры в по­ло­же­ние Пей­заж ее, ка­жет­ся, мож­но не сбра­сы­вать, и сле­ду­ет де­лать это толь­ко при пе­ре­клю­че­нии на Порт­рет (пе­ре­клю­че­ние ка­ме­ры при по­во­ро­те на Пей­заж вы­зо­вет «па­де­ние» при за­пи­си ви­део).}} &lt;br /&gt;
&lt;br /&gt;
С по­мо­щью Camera API мож­но сде­лать сни­мок так, что поль­зо­ва­тель ни о чем не уз­на­ет, но в по­дав­ляю­щем боль­шин­ст­ве слу­ча­ев сна­ча­ла нуж­но по­ка­зать изо­бра­же­ние с ка­ме­ры, а за­тем поль­зо­ва­тель на­жмет на кноп­ку. Для это­го соз­да­дим соб­ст­вен­ный класс CameraPreview, унас­ле­до­ван­ный от SurfaceView:&lt;br /&gt;
&lt;br /&gt;
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {&lt;br /&gt;
&lt;br /&gt;
private static final String TAG = “CameraPreview”;&lt;br /&gt;
&lt;br /&gt;
private SurfaceHolder sh;&lt;br /&gt;
&lt;br /&gt;
private Camera camera;&lt;br /&gt;
&lt;br /&gt;
public CameraPreview(Context context, Camera cm) {&lt;br /&gt;
&lt;br /&gt;
super(context);&lt;br /&gt;
&lt;br /&gt;
camera = cm;&lt;br /&gt;
&lt;br /&gt;
sh = getHolder();&lt;br /&gt;
&lt;br /&gt;
sh.addCallback(this);&lt;br /&gt;
&lt;br /&gt;
// ус­та­рев­ший, но тре­буе­мый pre-3.0&lt;br /&gt;
&lt;br /&gt;
sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void surfaceCreated(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
&lt;br /&gt;
camera.setPreviewDisplay(holder);&lt;br /&gt;
&lt;br /&gt;
camera.startPreview();&lt;br /&gt;
&lt;br /&gt;
} catch (IOException e) {&lt;br /&gt;
&lt;br /&gt;
Log.e(TAG, “Ошиб­ка ус­та­нов­ки пред­про­смот­ра: “ + e.getMessage());&lt;br /&gt;
&lt;br /&gt;
e.getStackTrace();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {&lt;br /&gt;
&lt;br /&gt;
if (sh.getSurface() == null) {&lt;br /&gt;
&lt;br /&gt;
// Нет по­верх­но­сти пред­про­смот­ра!&lt;br /&gt;
&lt;br /&gt;
return;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Ос­та­нов­ка пред­про­смот­ра до вне­се­ния из­ме­не­ний.&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
&lt;br /&gt;
camera.stopPreview();&lt;br /&gt;
&lt;br /&gt;
} catch (Exception e) {&lt;br /&gt;
&lt;br /&gt;
// По­пыт­ка пре­сечь не­су­ще­ст­вую­щий пред­про­смотр&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
&lt;br /&gt;
camera.setPreviewDisplay(sh);&lt;br /&gt;
&lt;br /&gt;
camera.startPreview();&lt;br /&gt;
&lt;br /&gt;
} catch (Exception e) {&lt;br /&gt;
&lt;br /&gt;
Log.e(TAG, “Ошиб­ка при рес­тар­те пред­про­смот­ра: ” + e.getMessage());&lt;br /&gt;
&lt;br /&gt;
e.getStackTrace();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void surfaceDestroyed(SurfaceHolder holder) {&lt;br /&gt;
&lt;br /&gt;
// За­ня­тие сле­дит за ос­во­бо­ж­де­ни­ем пред­про­смот­ра ка­ме­ры&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
{{Врезка|left|Заголовок= |Ширина=10%|Содержание= }} &lt;br /&gt;
Этот класс унас­ле­до­ван от SurfaceView, осу­ще­ст­в­ляю­ще­го рен­де­ринг го­раз­до бы­ст­рее, чем стан­дарт­ный View (и от­ри­сов­ка мо­жет вы­пол­нять­ся фо­но­вы­ми нитя­ми, че­го не до­пуска­ет View), что иде­аль­но для бы­ст­рой от­ри­сов­ки, ко­то­рая необходима нам для про­смот­ра изо­бра­жения с ка­ме­ры.&lt;br /&gt;
&lt;br /&gt;
Для досту­па к по­верх­но­сти изо­бра­жения нам по­на­до­бит­ся так­же реа­ли­зо­вать ин­тер­фейс SurfaceHolder.CallBack. Здесь необ­хо­ди­мы ме­то­ды surfaceCreated(), SurfaceChanged() и surfaceDestroyed().&lt;br /&gt;
&lt;br /&gt;
Мы по­лу­ча­ем SurfaceHolder (с по­мо­щью ме­то­да ро­ди­тель­ско­го клас­са), за­тем до­ба­вим к ней Callback, ко­то­рый про­ин­фор­ми­ру­ет кли­ен­та о лю­бых из­менениях с по­верх­но­стью.&lt;br /&gt;
&lt;br /&gt;
На­ша вер­сия surfaceChanged() ниче­го не ме­ня­ет. Же­лая вве­сти из­менения, де­лай­те это ме­ж­ду оста­нов­кой и за­пуском пред­про­смот­ра. Од­на из си­туа­ций, когда это мо­жет при­го­дить­ся – об­ра­бот­ка из­менения по­ло­жения уст­рой­ст­ва (ка­ме­ры и эк­ра­на) в про­стран­ст­ве.&lt;br /&gt;
&lt;br /&gt;
В уст­рой­ст­вах с Android вер­сии до 2.2 пред­про­смотр ав­то­ма­ти­че­­ски вклю­чал­ся как Пей­заж, и для мак­си­маль­ной со­вмес­ти­мо­сти про­ще все­го при­ну­ди­тель­но уста­но­вить ре­жим Пей­за­жа, до­ба­вив ат­ри­бут к эле­мен­ту activity в AndroidManifest.xml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;activity [ ... ] android:screenOrientation=”landscape” &amp;gt;&lt;br /&gt;
&lt;br /&gt;
Од­на­ко в вер­си­ях с 2.2 и вы­ше это мож­но уб­рать, вза­мен за­дав по­ло­же­ние про­смот­ра со­глас­но по­ло­же­нию уст­рой­ст­ва. До­бавь­те та­кие стро­ки в ме­тод surfaceChanged() в CameraPreview.java ме­ж­ду вы­зо­ва­ми stopPreview() и startPreview():&lt;br /&gt;
&lt;br /&gt;
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {&lt;br /&gt;
&lt;br /&gt;
camera.setDisplayOrientation(90);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Не за­будь­те уда­лить на­строй­ку пей­за­жа из AndroidManifest.xml, и вы уви­ди­те, что пред­про­смотр по­во­ра­чи­ва­ет­ся вслед за по­во­ро­том ка­ме­ры.&lt;br /&gt;
&lt;br /&gt;
Соз­дав класс CameraPreview, до­бавь­те ме­тод setUpLayout(), вы­зы­вае­мый из ме­то­да onCreate() в MyCameraActivity.&lt;br /&gt;
&lt;br /&gt;
Здесь он вы­де­лен в от­дель­ный ме­тод, что­бы про­ще при­ос­та­нав­ли­вать/во­зоб­нов­лять про­грам­му; под­роб­но­сти см. ни­же.&lt;br /&gt;
&lt;br /&gt;
private void setUpLayout() {&lt;br /&gt;
&lt;br /&gt;
setContentView(R.layout.main);&lt;br /&gt;
&lt;br /&gt;
preview = new CameraPreview(this, camera);&lt;br /&gt;
&lt;br /&gt;
FrameLayout frame = (FrameLayout) findViewById(R.id.camera_preview);&lt;br /&gt;
&lt;br /&gt;
frame.addView(preview);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Так­же нуж­но до­ба­вить кое-что в файл main.xml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=”1.0” encoding=”utf-8”?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”&lt;br /&gt;
&lt;br /&gt;
android:orientation=”horizontal”&lt;br /&gt;
&lt;br /&gt;
android:layout_width=”fill_parent”&lt;br /&gt;
&lt;br /&gt;
android:layout_height=”fill_parent”&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;FrameLayout&lt;br /&gt;
&lt;br /&gt;
android:id=”@+id/camera_preview”&lt;br /&gt;
&lt;br /&gt;
android:layout_width=”fill_parent”&lt;br /&gt;
&lt;br /&gt;
android:layout_height=”fill_parent”&lt;br /&gt;
&lt;br /&gt;
android:layout_weight=”1”&lt;br /&gt;
&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Button&lt;br /&gt;
&lt;br /&gt;
android:id=”@+id/button_capture”&lt;br /&gt;
&lt;br /&gt;
android:text=”Capture”&lt;br /&gt;
&lt;br /&gt;
android:layout_width=”wrap_content”&lt;br /&gt;
&lt;br /&gt;
android:layout_height=”wrap_content”&lt;br /&gt;
&lt;br /&gt;
android:layout_gravity=”center”&lt;br /&gt;
&lt;br /&gt;
/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ко­дом кноп­ки мы зай­мем­ся в сле­дую­щем раз­де­ле. Ском­пи­ли­руй­те и за­пус­ти­те про­грам­му, и на эк­ра­не долж­но поя­вить­ся изо­бра­же­ние с ка­ме­ры с кноп­кой Capture [Сде­лать сни­мок] ря­дом, хо­тя и при на­жа­тии кноп­ки по­ка ни­че­го не про­изой­дет.&lt;br /&gt;
&lt;br /&gt;
На­ко­нец, ра­нее я го­во­ри­ла, что по­сле на­пи­са­ния ко­да про­смот­ра ме­то­ды onPause() и onResume() нуж­но не­мно­го ус­лож­нить. Ес­ли про­сто ос­во­бо­дить ка­ме­ру, то при во­зоб­нов­ле­нии при­ло­же­ния ста­рый класс пред­про­смот­ра то­же по­про­бу­ет об­ра­тить­ся к объ­ек­ту ка­ме­ры, ко­то­рый у не­го был (и ко­то­рый те­перь ос­во­бо­ж­ден), и вы­зо­вет ис­клю­че­ние.&lt;br /&gt;
&lt;br /&gt;
Что­бы это ис­пра­вить, нуж­но ос­во­бо­ж­дать объ­ект при при­ос­та­нов­ке при­ло­же­ния, а при во­зоб­нов­ле­нии – соз­да­вать но­вый:&lt;br /&gt;
&lt;br /&gt;
protected void onPause() {&lt;br /&gt;
&lt;br /&gt;
releaseCamera();&lt;br /&gt;
&lt;br /&gt;
super.onPause();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
private void releaseCamera() {&lt;br /&gt;
&lt;br /&gt;
if (camera != null) {&lt;br /&gt;
&lt;br /&gt;
camera.stopPreview();&lt;br /&gt;
&lt;br /&gt;
camera.release();&lt;br /&gt;
&lt;br /&gt;
camera = null;&lt;br /&gt;
&lt;br /&gt;
preview = null;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
protected void onResume() {&lt;br /&gt;
&lt;br /&gt;
if (camera == null) {&lt;br /&gt;
&lt;br /&gt;
camera = getCameraInstance();&lt;br /&gt;
&lt;br /&gt;
setUpLayout();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
super.onResume();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Те­перь вы смо­же­те вый­ти из про­грам­мы и за­тем пе­ре­за­пус­тить ее без оши­бок.&lt;/div&gt;</summary>
		<author><name>Olkol</name></author>	</entry>

	</feed>