使用包名无法启动活动

3

我正在尝试使用一个库,其中必须传递动作和URI,并且要打开活动,我必须使用包名,但问题是,即使我更改包名,它根本不起作用。这是我正在尝试的代码:

 Intent intent = new Intent(Intent.ACTION_EDIT, Uri.parse(filename));
        intent.putExtra("was_get_content_intent", mWasGetContentIntent);
        intent.setClassName("neelay.mediaplayer.beatbox.ringdroid", "neelay.mediaplayer.beatbox.ringdroid.RingdroidEditActivity");
        startActivityForResult(intent, REQUEST_CODE_EDIT);

这是我用于设置活动的清单代码。
 <activity
        android:name=".ringdroid.RingdroidSelectActivity"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Holo">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.GET_CONTENT" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.OPENABLE" />

            <data android:mimeType="audio/*" />
        </intent-filter>
    </activity>
    <activity
        android:name=".ringdroid.RingdroidEditActivity"
        android:configChanges="orientation|screenSize|keyboardHidden"
        android:hardwareAccelerated="true"
        android:windowSoftInputMode="adjustResize">
        <intent-filter android:label="@string/edit_intent">
            <action android:name="android.intent.action.EDIT" />

            <data android:mimeType="audio/*" />
        </intent-filter>
    </activity>

包名为package="neelay.mediaplayer.beatbox"。 我知道通过调用活动的名称很容易打开活动,但在这种情况下,我必须通过uri传递操作,这是我所能看到的唯一可能的方法,指南会很有帮助。


你在第一个代码片段的第四行调用了 startActivityForResult(),但是没有调用 startActivity。当你进行这个调用时,你要么会启动所需的活动,要么会崩溃并抛出 ActivityNotFoundException 异常。由于这似乎是你自己应用程序中的活动,更安全的构建 Intent 的方法是 new Intent(this, RingdroidEditActivity.class).setAction(Intent.ACTION_EDIT).setDataAndType(Uri.parse(filename), ...).putExtra("was_get_content_intent", mWasGetContentIntent);,其中 ... 被替换为此内容的实际 MIME 类型。 - CommonsWare
media 不是有效的 MIME 类型,也与您 <intent-filter> 中的 <data> 元素不匹配。由于这是您的文件,您应该知道实际的 MIME 类型是什么。如果出于某种原因您不知道,可以使用 setData() 而不是 setDataAndType(),Android 将尝试根据文件扩展名猜测。此外,我的猜测是您的代码被包装在 try/catch 块中,并且您需要确保它将错误记录到 LogCat,以便在调试应用程序时查看这些错误。 - CommonsWare
REQUEST_CODE_EDIT 的值是多少? - David Wasser
@DavidWasser 它是1。 - SAVVY
你应该在清单文件中添加完整的包名,例如: neelay.mediaplayer.beatbox.ringdroid.RingdroidSelectActivity,并且尝试为打开此活动的位置添加标志... 是否来自后台。 - Sagar Chavada
显示剩余7条评论
1个回答

1
你说你的包名(在清单文件中)是“neelay.mediaplayer.beatbox”。如果是这样,你需要更改以下内容:
intent.setClassName("neelay.mediaplayer.beatbox.ringdroid", "neelay.mediaplayer.beatbox.ringdroid.RingdroidEditActivity");

转换为:

intent.setClassName("neelay.mediaplayer.beatbox", "neelay.mediaplayer.beatbox.ringdroid.RingdroidEditActivity");

由于有多种设置 Component 的方法,您也可以使用以下任何一种方法:

intent.setClassName(this, "neelay.mediaplayer.beatbox.ringdroid.RingdroidEditActivity");

或者像这样:

这里是内容

intent.setClassName(getApplicationContext(), "neelay.mediaplayer.beatbox.ringdroid.RingdroidEditActivity");

或者像这样:

或这样:

intent.setComponent(new ComponentName("neelay.mediaplayer.beatbox", "neelay.mediaplayer.beatbox.ringdroid.RingdroidEditActivity"));

或者像这样:

或者像这样:

intent.setComponent(new ComponentName(this, "neelay.mediaplayer.beatbox.ringdroid.RingdroidEditActivity"));

或者像这样:

或这样:

intent.setComponent(new ComponentName(getApplicationContext(), "neelay.mediaplayer.beatbox.ringdroid.RingdroidEditActivity"));

是的,@david wasser,你说得对,这就是我犯的错误,但你能再加一件事吗?intent.setClassName(getApplicationContext(), "neelay.mediaplayer.tryal.ringdroid.RingdroidEditActivity"); 这个也对我有用,那么它就是一个完整的答案了。 - SAVVY
1
有几种设置组件的方法,您可以使用其中任何一种。 - David Wasser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接