Я столкнулся с проблемой при открытии электронной почты в MYApp, когда я выбрал режим запуска «singleInstance».
Я прикрепил образец проекта Android, который считывает имя файла из вложения электронной почты и отображает его на экране. Прекрасно работает в случае onCreate, но выдает ошибку в onNewIntent, когда режим запуска приложений - singleInstance.
Launchmode.java
package your.namespace.launchmode;
public class LaunchModeActivity extends Activity {
private static final int OPEN_ACT = 2;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String name = getAttachmetName(getIntent());
if(null != name)
{
TextView textv = (TextView) findViewById(R.id.attachmentnm);
textv.setText(name);
}
}
@Override
protected void onNewIntent(Intent savedInstanceState)
{
super.onNewIntent(savedInstanceState);
String name = getAttachmetName(savedInstanceState);
if(null != name)
{
TextView textv = (TextView) findViewById(R.id.attachmentnm);
textv.setText(name);
}
}
private String getAttachmetName(Intent intent) {
final Uri documentUri = intent.getData();
if(null != documentUri){
final String uriString = documentUri.toString();
String documentFilename = null;
final int mailIndexPos = uriString.lastIndexOf("/attachments");
if (mailIndexPos != -1) {
final Uri curi = documentUri;
final String [] projection = new String[] {OpenableColumns.DISPLAY_NAME};
final Cursor cursor = getApplicationContext().getContentResolver().query(curi, projection, null, null, null);
if (cursor != null) {
final int attIdx = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
if (attIdx != -1) {
cursor.moveToFirst();
documentFilename = cursor.getString(attIdx);
}
cursor.close();
}
}
return documentFilename;
}
return null;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if((resultCode == RESULT_OK) && (requestCode == OPEN_ACT))
{
Log.d("LaunchMode", "Second activity returned");
}
}
}
AndroidManifest
Действия по воспроизведению 1) Установить apk на устройство. 2) Перейдите в собственное приложение Gmail на устройстве, откройте любое вложение (офисный документ) для просмотра. 3) Выберите приложение LaunchMode, чтобы завершить действие. 4) Приложение LaunchMode отобразит имя файла на экране.
Это нормально работает в первый раз (поток onCreate), но когда это приложение переключается в фоновый режим, и я снова пробую 2,3,4 шага .. приложение вылетает с ошибкой
E/DatabaseUtils(30615): java.lang.SecurityException: Permission Denial: reading com.google.android.gm.provider.MailProvider uri content://gmail-ls/qoconnect@gmail.com/messages/5/attachments/0.2/BEST/false from pid=32657, uid=10058 requires com.google.android.gm.permission.READ_GMAIL
E/DatabaseUtils(30615): at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:309)
E/DatabaseUtils(30615): at android.content.ContentProvider$Transport.bulkQuery(ContentProvider.java:178)
E/DatabaseUtils(30615): at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:111)
E/DatabaseUtils(30615): at android.os.Binder.execTransact(Binder.java:339)
E/DatabaseUtils(30615): at dalvik.system.NativeStart.run(Native Method)
D/AndroidRuntime(32657): Shutting down VM
Мне нужно исправить это, так как мне нужно иметь один экземпляр приложения и также должен получать имя вложения электронной почты. Пожалуйста, дайте мне знать, если мне что-то здесь не хватает.
У меня вопрос, почему он работает в потоке onCreate и не будет работать в случае onNewIntent
Примечание: 1) Прекрасно работает с телефонами 2.x 2) Прекрасно работает с режимом запуска Single Top. 3) Некоторые обновления в приложении Gmail. ссылка здесь: