Чтобы ваше приложение могло быть выбрано в качестве приложения обмена сообщениями по умолчанию (насколько это касается системы), вы должны перечислить все компоненты манифеста, как показано в этом сообщении в блоге, классы действительно существуют или нет.
<manifest>
...
<application>
<!-- BroadcastReceiver that listens for incoming SMS messages -->
<receiver android:name=".SmsReceiver"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_DELIVER" />
</intent-filter>
</receiver>
<!-- BroadcastReceiver that listens for incoming MMS messages -->
<receiver android:name=".MmsReceiver"
android:permission="android.permission.BROADCAST_WAP_PUSH">
<intent-filter>
<action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
<data android:mimeType="application/vnd.wap.mms-message" />
</intent-filter>
</receiver>
<!-- Activity that allows the user to send new SMS/MMS messages -->
<activity android:name=".ComposeSmsActivity" >
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SENDTO" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="sms" />
<data android:scheme="smsto" />
<data android:scheme="mms" />
<data android:scheme="mmsto" />
</intent-filter>
</activity>
<!-- Service that delivers messages from the phone "quick response" -->
<service android:name=".HeadlessSmsSendService"
android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="sms" />
<data android:scheme="smsto" />
<data android:scheme="mms" />
<data android:scheme="mmsto" />
</intent-filter>
</service>
</application>
</manifest>
Поскольку система проверяет только манифест приложения, чтобы определить, может ли он действовать как приложение для обмена сообщениями по умолчанию, не все классы классов должны существовать для вашего приложения, чтобы показывать в списке выбора по умолчанию. Это полезно для обучения и тестирования, но, очевидно, если ваше приложение будет действовать как клиент обмена сообщениями по умолчанию пользователя, он должен полностью реализовать все указанные компоненты.
Если вы намереваетесь выполнять любое SMS-сообщение / MMS, вам также понадобятся соответствующие разрешения. Хотя система, по-видимому, не проверяет их при определении подходящих кандидатов приложений по умолчанию, для их соответствующих операций необходимы следующие разрешения:
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.RECEIVE_MMS" />
Если вам не хватает SEND_SMS
, READ_SMS
, или WRITE_SMS
, когда вы пытаетесь выполнить данное действие, будет выбрано SecurityException
. Однако, если вам не хватает разрешения RECEIVE_*
, ваше приложение будет просто не доставлять соответствующие трансляции, и может показаться, что при тестировании этих функций ничего не происходит.
Наконец-то это сработало. Вот код
IDENTIFICATION DIVISION.
PROGRAM-ID.RemoveDup2.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUTFILEDUP ASSIGN TO 'C:\Cobol\INPUTFILEDUP.txt'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT OUTFILEDUP ASSIGN TO 'C:\Cobol\OUTFILEDUP.txt'
ORGANIZATION IS LINE SEQUENTIAL.
SELECT WorkFile ASSIGN TO "WORK.TMP".
DATA DIVISION.
FILE SECTION.
FD INPUTFILEDUP.
01 INPUTFILEDUPREC.
88 EOFINPUTFILEDUP VALUE HIGH-VALUES.
02 INPUTFILEID PIC 9(07).
FD OUTFILEDUP.
01 OUTFILEDUPREC PIC 9(07).
SD WorkFile.
01 WORKREC.
02 WINPUTFILEID PIC 9(07).
WORKING-STORAGE SECTION.
77 WS-VARIABLE PIC 9(09) VALUE ZERO.
77 REC-NOT-MATCH PIC 9(01).
77 CUR-VARIABLE PIC 9(7) VALUE ZERO.
PROCEDURE DIVISION.
BEGIN.
SORT WorkFile ON ASCENDING KEY WINPUTFILEID
USING INPUTFILEDUP GIVING INPUTFILEDUP
OPEN INPUT INPUTFILEDUP
OPEN OUTPUT OUTFILEDUP
READ INPUTFILEDUP
AT END SET EOFINPUTFILEDUP TO TRUE
END-READ
PERFORM UNTIL (EOFINPUTFILEDUP)
IF INPUTFILEID NOT EQUAL TO WS-VARIABLE
MOVE INPUTFILEID TO WS-VARIABLE
WRITE OUTFILEDUPREC FROM INPUTFILEID
READ INPUTFILEDUP
AT END SET EOFINPUTFILEDUP TO TRUE
PERFORM UNTIL (EOFINPUTFILEDUP)
ELSE
DISPLAY "DUPLICATE FOUND " INPUTFILEID
READ INPUTFILEDUP
AT END SET EOFINPUTFILEDUP TO TRUE
END-READ
END-PERFORM
CLOSE INPUTFILEDUP
CLOSE OUTFILEDUP
STOP RUN.
Если вы отсортируете файл с помощью внешней сортировки перед чтением его в коболе программы вы можете удалить дубликаты с ключевым словом SORT EQUALS. Если вы отсортируете файл до программы cobol и не удаляете дубликаты, то простой оператор IF и поле сохранения позволят вам удалить дубликаты.
Настройте поле INPUTFILEID-save. Сразу после чтения .... ЕСЛИ inputfileid равняется inputfileid-save читать снова, если не писать ... после записи переместите inputfileid в inputfileid-save. Для этого вам придется прервать текущий спектакль.
Если вы не совсем понимаете, о чем я говорю, и хотите помочь вам изменить код, просто дайте мне знать
sort является стандартным для этих заданий os-close, чтобы следовать принципу DRY, шестерни -t для разделителя и -u для уникальных. Это К.
Когда Организация
имеет значение Последовательный
, удаленная запись является последней прочитанной записью. Оператор Delete
действителен только в том случае, если последняя операция с файлом является успешной оператором Read
. В противном случае Delete
возвращает значение File Status
, равное 43. Поскольку Delete
не может возвращать значения File Status
, начинающиеся с 2, когда файл имеет вид Открыть
с Последовательный
доступ, кодирование Недействительный ключ
в таком Удалить
запрещено.
Когда Для файла выбран динамический
или Произвольный
доступ, параметр Удалить
, как и Rewrite
, становится немного менее ограничительным. Удаляемая запись не обязательно должна быть предварительно прочитана. Просто введите информацию о первичном ключе
в описание записи для файла и выполните оператор Delete
. Если запись не существует, возвращается 23 статус файла
и существует условие Неверный ключ
.
Со страницы 274 из
Sams научитесь COBOL за 24 часа
страница 274 (которую я только что стер с моей книжной полки). Таким образом, в вашем случае вы, вероятно, настроите свои записи для сортировки по INPUTFILEID
, сделайте запись по мере того, как вы проходите случаи появления данного INPUTFILEID
после его первого появления, и Удалите
соответственно (после того, как вы записали его в выходной файл).
в описание записи для файла и выполните оператор Delete
. Если запись не существует, возвращается 23 статус файла
и существует условие Неверный ключ
.
Со страницы 274 из
Самс научитесь COBOL за 24 часа
страница 274 (которую я только что стер с моей книжной полки). Таким образом, в вашем случае вы, вероятно, настроите свои записи для сортировки по INPUTFILEID
, сделайте запись по мере того, как вы проходите вхождения данного INPUTFILEID
после его первого появления, и Удалите
соответственно (после того, как вы записали его в выходной файл).
в описание записи для файла и выполните оператор Delete
. Если запись не существует, возвращается 23 статус файла
и существует условие Неверный ключ
.
Со страницы 274 из
Самс научитесь COBOL за 24 часа
страница 274 (которую я только что стер с моей книжной полки). Таким образом, в вашем случае вы, вероятно, настроите свои записи для сортировки по INPUTFILEID
, сделайте запись по мере того, как вы проходите случаи появления данного INPUTFILEID
после его первого появления, и Удалите
соответственно (после того, как вы записали его в выходной файл).
Статус файла
из 23 и существует условие Неверный ключ
.
Со страницы 274 из
Самс научитесь COBOL за 24 часа
, страница 274 (которая Я только что стер пыль с моей книжной полки). Таким образом, в вашем случае вы, вероятно, настроите свои записи для сортировки по INPUTFILEID
, сделайте запись по мере того, как вы проходите случаи появления данного INPUTFILEID
после его первого появления, и Удалите
соответственно (после того, как вы записали его в выходной файл).
Статус файла
из 23 и существует условие Неверный ключ
.
Со страницы 274 из
Самс научитесь COBOL за 24 часа
, страница 274 (которая Я только что стер пыль с моей книжной полки). Таким образом, в вашем случае вы, вероятно, настроите свои записи для сортировки по INPUTFILEID
, сделайте запись по мере того, как вы проходите вхождения данного INPUTFILEID
после его первого появления, и Удалите
соответственно (после того, как вы записали его в выходной файл).